From 78fc982247d2f5a02131c61f8e1279268dd93033 Mon Sep 17 00:00:00 2001 From: Camil Staps Date: Tue, 14 Nov 2017 12:04:50 +0100 Subject: Start & cleanup assignment 8 --- assignment-8/skeleton8.icl | 63 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 51 insertions(+), 12 deletions(-) diff --git a/assignment-8/skeleton8.icl b/assignment-8/skeleton8.icl index 0c68ac9..3e81cce 100644 --- a/assignment-8/skeleton8.icl +++ b/assignment-8/skeleton8.icl @@ -5,6 +5,21 @@ module skeleton8 * Pieter Koopman, pieter@cs.ru.nl */ +import StdList +import StdString + +import Control.Applicative +import Control.Monad +from Control.Monad.State import :: StateT(StateT), + instance Functor (StateT s m), instance Applicative (StateT s m), instance Monad (StateT s m), + gets, modify +import Data.Error +from Data.Func import $ +import Data.Functor +import qualified Data.Map as Map +import Data.Maybe +from Text import <+ + from iTasks import class iTask, class toPrompt, class Publishable, instance Publishable Task, instance toPrompt String, instance Functor Task, class TApplicative, instance TApplicative Task, @@ -14,12 +29,13 @@ from iTasks import class iTask, class toPrompt, class Publishable, instance Publ -||-, -||, ||-, >>*, always, hasValue, updateInformation, viewInformation, startEngine import qualified iTasks import qualified iTasks.WF.Combinators.Overloaded as WF -import Data.Functor, Control.Applicative, Control.Monad -import Data.Tuple, StdClass, StdList, StdMaybe, StdString -import StdGeneric, StdBool -from StdFunc import o -import qualified Data.List as List -import qualified Data.Map as Map + +(>>>=) :== 'iTasks'.tbind +(>>>|) a b :== 'iTasks'.tbind a (\_ -> b) +treturn :== 'iTasks'.return +ActionOk :== 'iTasks'.ActionOk +ActionQuit :== 'iTasks'.ActionQuit +ActionNew :== 'iTasks'.ActionNew :: Expression = New [Int] @@ -52,16 +68,39 @@ import qualified Data.Map as Map // === State +:: Val + = VElem Int + | VSet [Int] + +:: State :== 'Map'.Map Ident Val + +:: Sem a :== StateT State (MaybeError String) a +// Or define :: Sem a = Sem (s -> MaybeErrorString (a,s)) and copy the relevant +// instances from Control.Monad.State + +store :: Ident Val -> Sem Val +store i v = modify ('Map'.put i v) $> v + +read :: Ident -> Sem Val +read i = gets ('Map'.get i) >>= \v -> case v of + Nothing -> fail $ "unknown variable '" <+ i <+ "'" + Just v -> pure v + +fail :: String -> Sem a +fail e = StateT \_ -> Error e + +eval :: Expression -> Sem Val +eval (New xs) = pure $ VSet xs +eval (Elem x) = pure $ VElem x +eval (Variable i) = read i +eval (Size s) = eval s >>= \xs -> case xs of + VSet xs -> pure $ VElem $ length xs + _ -> fail "Size :: Set -> Elem applied to Elem" +//eval (a +. b) TODO // === semantics // === simulation -(>>>=) :== 'iTasks'.tbind -(>>>|) a b :== 'iTasks'.tbind a (\_ -> b) -treturn :== 'iTasks'.return -ActionOk :== 'iTasks'.ActionOk -ActionQuit :== 'iTasks'.ActionQuit -ActionNew :== 'iTasks'.ActionNew Start = () -- cgit v1.2.3