--- /dev/null
+module GetallenRaden\r
+\r
+/* Dynamics werken alleen met de 32-bit versie van de Clean compiler.\r
+ (*) Gebruik Environment 'Experimental'\r
+ (*) In Project:Project Options: zet vlag 'Enable dynamics' aan\r
+*/\r
+import StdEnv\r
+import StdDynamic, StdDynamicFileIO // nodig voor dynamics en dynamics in files\r
+import StdFileSelect // platform file-selector dialoog\r
+\r
+Start :: *World -> *World\r
+Start world\r
+ = world\r
[ sum` [1 .. 5] == sum [1 .. 5]\r
, prod` [1 .. 5] == prod [1 .. 5]\r
, flatten` [[],[1],[1,2],[1,2,3]] == flatten [[],[1],[1,2],[1,2,3]]\r
+ , length` [1 .. 5] == length [1 .. 5]\r
, reverse` [1 .. 5] == reverse [1 .. 5]\r
+ , filter` isEven [1 .. 100] == filter isEven [1 .. 100]\r
, takeWhile` ((<>) 0) [1,2,3,0,4,5,6] == takeWhile ((<>) 0) [1,2,3,0,4,5,6]\r
, maxList` [1 .. 5] == maxList [1 .. 5]\r
]\r
\r
-sum` = ...\r
-prod` = ...\r
-flatten` = ...\r
-length` = ...\r
-reverse` = ...\r
-takeWhile` = ...\r
-maxList` = ...\r
+sum` xs = ...\r
+prod` xs = ...\r
+flatten` xs = ...\r
+length` xs = ...\r
+reverse` xs = ...\r
+filter` p xs = ...\r
+takeWhile` p xs = ...\r
+maxList` xs = ...\r
--- /dev/null
+definition module StdDynSet\r
+\r
+import StdOverloaded\r
+\r
+class Set a | TC, ==, toString a\r
+\r
+:: Set\r
+\r
+instance zero Set\r
+instance toString Set\r
+instance == Set\r
+\r
+toSet :: a -> Set | Set a\r
+\r
+nrOfElts :: Set -> Int\r
+isEmptySet :: Set -> Bool\r
+\r
+memberOfSet :: a Set -> Bool | Set a\r
+isSubset :: Set Set -> Bool\r
+isStrictSubset :: Set Set -> Bool\r
+\r
+union :: Set Set -> Set\r
+intersection :: Set Set -> Set\r
+without :: Set Set -> Set\r
--- /dev/null
+implementation module StdDynSet\r
+\r
+import StdEnv\r
+import StdDynamic\r
+\r
+class Set a | TC, ==, toString a\r
+\r
+:: Set = Set [Dynamic]\r
+\r
+instance zero Set\r
+where zero = abort "zero instance voor Set nog niet geimplementeerd.\n"\r
+\r
+instance toString Set\r
+where toString a = abort "toString instance voor Set nog niet geimplementeerd.\n"\r
+\r
+instance == Set\r
+where == a b = abort "== instance voor Set nog niet geimplementeerd.\n"\r
+\r
+toSet :: a -> Set | Set a\r
+toSet a = abort "toSet nog niet geimplementeerd.\n"\r
+\r
+nrOfElts :: Set -> Int\r
+nrOfElts a = abort "nrOfElts nog niet geimplementeerd.\n"\r
+\r
+isEmptySet :: Set -> Bool\r
+isEmptySet a = abort "isEmptySet nog niet geimplementeerd.\n"\r
+\r
+memberOfSet :: a Set -> Bool | Set a\r
+memberOfSet x a = abort "memberOfSet nog niet geimplementeerd.\n"\r
+\r
+isSubset :: Set Set -> Bool\r
+isSubset a b = abort "isSubset nog niet geimplementeerd.\n"\r
+\r
+isStrictSubset :: Set Set -> Bool\r
+isStrictSubset a b = abort "isStrictSubset nog niet geimplementeerd.\n"\r
+\r
+union :: Set Set -> Set\r
+union a b = abort "union nog niet geimplementeerd.\n"\r
+\r
+intersection :: Set Set -> Set\r
+intersection a b = abort "intersection nog niet geimplementeerd.\n"\r
+\r
+without :: Set Set -> Set\r
+without a b = abort "without nog niet geimplementeerd.\n"\r
--- /dev/null
+definition module StdIOMonad\r
+\r
+// Deze module verpakt een aantal StdFile functies in een monadische jas\r
+\r
+import StdMonad, StdMaybeMonad\r
+\r
+:: IO a\r
+:: Void = Void\r
+:: Filemode = Lees | Schrijf\r
+:: Filenaam :== String\r
+:: Filehandle\r
+\r
+// voer monadische I/O actie uit op de wereld:\r
+doIO :: (IO a) *World -> (a,*World)\r
+\r
+// IO is een monad:\r
+instance return IO\r
+instance >>= IO\r
+\r
+// lees regel van de console:\r
+read :: IO String\r
+\r
+// schrijf regel naar de console:\r
+write :: String -> IO Void\r
+\r
+// open de file met gegeven filenaam en mode:\r
+open :: Filenaam Filemode -> IO (Maybe Filehandle)\r
+\r
+// sluit de file met gegeven filenaam:\r
+close :: Filehandle -> IO Bool\r
+\r
+// bepaal of het lezen van de file klaar is:\r
+eof :: Filehandle -> IO Bool\r
+\r
+// lees een regel van een file:\r
+readline :: Filehandle -> IO (Maybe String)\r
+\r
+// schrijf een regel naar een file:\r
+writeline :: String Filehandle -> IO Bool\r
--- /dev/null
+implementation module StdIOMonad\r
+\r
+// Deze module verpakt StdFile in een monadische jas\r
+\r
+import StdFile\r
+import StdMonad\r
+\r
+:: IO a // kies een geschikte representatie voor IO\r
+:: Filemode = Lees | Schrijf\r
+:: Filenaam :== String\r
+:: Filehandle // kies een geschikte representatie voor Filehandle\r
+\r
+instance toInt Filemode where\r
+ toInt Lees = FReadText\r
+ toInt Schrijf = FWriteText\r
--- /dev/null
+definition module StdListMonad\r
+\r
+import StdMonad\r
+\r
+instance return []\r
+instance >>= []\r
+instance fail []\r
--- /dev/null
+implementation module StdListMonad\r
+\r
+import StdMonad\r
+\r
+instance return [] where return x = [x]\r
+instance >>= [] where >>= xs f = [y \\ x <- xs, y <- f x]\r
+instance fail [] where fail = []\r
--- /dev/null
+definition module StdMaybeMonad\r
+\r
+import StdMonad\r
+\r
+:: Maybe a = Nothing | Just a\r
+\r
+instance return Maybe\r
+instance >>= Maybe\r
+instance fail Maybe\r
--- /dev/null
+implementation module StdMaybeMonad\r
+\r
+import StdMonad\r
+\r
+:: Maybe a = Nothing | Just a\r
+\r
+instance return Maybe where return x = Just x\r
+instance >>= Maybe where >>= (Just x) f = f x\r
+ >>= Nothing f = Nothing\r
+instance fail Maybe where fail = Nothing\r
\r
import StdEnv\r
\r
-:: Q = ...\r
+:: Q = ... // maak deze type definitie af\r
-definition module StdSet\r
+implementation module StdSet\r
\r
-import StdClass\r
+import StdEnv\r
\r
:: Set a\r
-\r
-toSet :: [a] -> Set a | Eq a\r
-fromSet :: (Set a) -> [a]\r
-\r
-isEmptySet :: (Set a) -> Bool\r
-isDisjoint :: (Set a) (Set a) -> Bool | Eq a\r
-isSubset :: (Set a) (Set a) -> Bool | Eq a\r
-isStrictSubset :: (Set a) (Set a) -> Bool | Eq a\r
-memberOfSet :: a (Set a) -> Bool | Eq a\r
-union :: (Set a) (Set a) -> Set a | Eq a\r
-intersection :: (Set a) (Set a) -> Set a | Eq a\r
-nrOfElements :: (Set a) -> Int\r
-without :: (Set a) (Set a) -> Set a | Eq a\r
-\r
-product :: (Set a) (Set b) -> Set (a,b)\r
-\r
-instance zero (Set a)\r
-instance == (Set a) | Eq a\r
-\r
-powerSet :: (Set a) -> Set (Set a)\r
\r
import StdEnv\r
\r
-:: SortList a\r
+:: SortList a = ... // maak deze type definitie af (mag ook een synoniem type zijn, maar gebruik dan :== in plaats van =)\r
\r
import StdEnv\r
\r
-:: Stack a\r
+:: Stack a = ... // maak deze type definitie af (mag ook een synoniem type zijn, maar gebruik dan :== in plaats van =)\r
\r
Start = ( "s0 = newStack = ", s0,'\n'\r
, "s1 = push 1 s0 = ", s1,'\n'\r
--- /dev/null
+definition module StdStateMonad\r
+\r
+import StdMonad\r
+\r
+:: ST s a\r
+\r
+instance return (ST s)\r
+instance >>= (ST s)\r
+\r
+mkST :: (s -> *(a,s)) -> ST s a\r
+unST :: (ST s a) -> s -> *(a, s)\r
--- /dev/null
+implementation module StdStateMonad\r
+\r
+import StdMonad\r
+\r
+:: ST s a = ST (s -> (a, s))\r
+\r
+instance return (ST s) where return x = ST (\w = (x, w))\r
+instance >>= (ST s) where >>= (ST f) g = ST (\w = let (a, w1) = f w \r
+ in unST (g a) w1\r
+ )\r
+\r
+mkST :: (s -> (a,s)) -> ST s a\r
+mkST f = ST f\r
+\r
+unST :: (ST s a) -> s -> (a, s)\r
+unST (ST f) = f\r