--- /dev/null
+module EchoMonad\r
+\r
+import StdString // expliciete import uit StdEnv om nameclash met StdFunc / StdIOMonad te voorkomen\r
+import StdIOMonad\r
+import StdMaybeMonad\r
+\r
+Start :: *World -> (Void,*World)\r
+Start world = doIO echo world\r
+\r
+echo :: IO Void\r
+echo = read >>= \regel ->\r
+ if (regel == "\n")\r
+ (return Void) \r
+ (write regel >>= \_ -> echo)\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
-module StdIOMonad
-
-import StdEnv, StdMaybe, StdMonad, StdFile
-
-:: IO a = IO (*World -> *(a, *World))
-
-read :: *World -> (IO String, *World)
-read world
-# (io, world) = stdio world
-# (line, io) = freadline io
-# (ok, world) = fclose io
-| not ok = abort "Couldn't close console"
-| otherwise = line
-
-instance return IO where
- return x = IO (\w = (x, w))
-
-instance >>= IO where
- >>= (IO f) g = (IO f)
-
-Start :: *World -> (IO String, *World)
-Start world = read
+implementation module StdIOMonad\r
+\r
+// Deze module verpakt StdFile in een monadische jas\r
+\r
+import StdFile\r
+import StdMonad\r
+//import StdOverloaded\r
+\r
+:: IO a = 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
--- /dev/null
+module ToonFileMonad\r
+\r
+import StdArray, StdInt, StdString // expliciete imports van StdEnv om name-clash met StdFunc en StdIOMonad te voorkomen\r
+import StdIOMonad\r
+import StdMaybeMonad\r
+\r
+Start :: *World -> (Void,*World)\r
+Start world = doIO toon world\r
+\r
+toon :: IO Void\r
+toon = write "Voer een filenaam in: " >>= \_ ->\r
+ read >>= \filenaam ->\r
+ open (filenaam%(0,size filenaam-2)) Lees >>= \misschien_filehandle ->\r
+ case misschien_filehandle of\r
+ Nothing\r
+ = write ("Kon " +++ filenaam +++ " niet openen.\n") >>= \_ ->\r
+ return Void\r
+ Just filehandle\r
+ = toon_inhoud filehandle\r
+\r
+toon_inhoud :: Filehandle -> IO Void\r
+toon_inhoud filehandle\r
+ = eof filehandle >>= \einde ->\r
+ if einde\r
+ (return Void)\r
+ (readline filehandle >>= \misschien_regel ->\r
+ case misschien_regel of\r
+ Nothing = return Void\r
+ Just regel = write regel >>= \_ -> toon_inhoud filehandle\r
+ )\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
+/*\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
+import StdMaybeMonad\r
+\r
+\r
+:: IO a = IO (*World Filehandle -> *(a, *World, Filehandle))\r
+:: Void = Void\r
+:: Filemode = Lees | Schrijf\r
+:: Filenaam :== String\r
+:: *Filehandle = None | FH *(Bool, Filemode, *File)\r
+\r
+toInt :: Filemode -> Int\r
+toInt Lees = FReadText\r
+toInt Schrijf = FWriteText\r
+\r
+Start world = read\r
+\r
+////voer monadische I/O actie uit op de wereld:\r
+//doIO :: (IO a) *World -> *(a,*World)\r
+//doIO (IO f) world = f (world, Closed)\r
+\r
+// IO is een monad:\r
+instance return IO where\r
+ return x = IO (\w fh = (x, w, fh))\r
+//instance >>= IO where\r
+// (>>=) (IO f) g = IO(\w = let (a, w1) = f w in doIO (g a) w1)\r
+\r
+//lees regel van de console:\r
+read:: IO String\r
+read = IO (\w fh -> ("", w, fh))\r
+\r
+/*//schrijf regel naar de console:\r
+write:: String -> IO Void\r
+write s = IO (\w = (Void, write` s w))\r
+ where\r
+ write`:: String *World -> *World\r
+ write` s world\r
+ # (io, world) = stdio world\r
+ # io = fwrites s world\r
+ # (_, world) = fclose io\r
+ = world\r
+\r
+//open de file met gegeven filenaam en mode:\r
+open:: Filenaam Filemode -> IO (Maybe Filehandle)\r
+open s m = IO (\w = let (f1, w1) = openfh` s m w in (f1, (w1, f1)))\r
+ where\r
+ openfh`:: Filenaam Filemode *World -> (Maybe Filehandle, *World)\r
+ openfh` s m world\r
+ # (ok, file, world) = fopen s (toInt m) world\r
+ | ok = (Just (Open (m, file)), world)\r
+ | otherwise = (Nothing, world)\r
+\r
+//sluit de file met gegeven filenaam:\r
+close:: Filehandle -> IO Bool\r
+close fh = IO (\w = let (b1, w1) = close` fh w in (b1, (w1, Closed)))\r
+ where\r
+ close`:: Filehandle *World -> (Bool, *World)\r
+ close` Closed world = (False, world)\r
+ close` (Open (_, file)) world = fclose file world\r
+\r
+//bepaal of het lezen van de file klaar is:\r
+eof:: Filehandle -> IO Bool\r
+eof fh = IO (\w = let (b1, w1) = eof` fh w in (b1, (w1, Closed)))\r
+ where\r
+ eof`:: Filehandle *World -> (Bool, *World)\r
+ eof` Closed world = (world, False)\r
+ eaf`(Open (_, file)) world = fclose file\r
+\r
+//lees een regel van een file:\r
+readline:: Filehandle -> IO (Maybe String)\r
+readline fh = IO (\w = let r1 = readline` fh w in r1)\r
+ where\r
+ readline`:: Filehandle *World -> (Maybe String, (*World, Filehandle))\r
+ readline` Closed world = (world, Nothing)\r
+ readline` (Open (Schrijf, _)) world = (world, Nothing)\r
+ readline` (Open (Lees, file)) world\r
+ # (line, file) = sfreadline file\r
+ = (Just line, (world, Open (Lees, file)))\r
+\r
+//schrijf een regel naar een file:\r
+writeline:: String Filehandle -> IO Bool\r
+writeline s fh = IO (\w = let r1 = writeline` s fh w in r1)\r
+ where\r
+ writeline`:: String Filehandle *World -> (Bool, (*World, Filehandle))\r
+ writeline` line Closed world = (False, (world, Closed))\r
+ writeline` line (Open (Lees, file)) world = (False, (world, (Open (Lees, file))))\r
+ writeline` line (Open (Schrijf, file)) world\r
+ # file = fwrites line file\r
+ = (True, (world, file))*/\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
--- /dev/null
+definition module StdMonad\r
+\r
+class return c :: a -> c a\r
+class (>>=) infix 0 c :: (c a) (a -> c b) -> c b\r
+class fail c :: c a\r
+\r
+class Monad c | return, >>= c\r
+class MonadFail c | Monad, fail c\r
--- /dev/null
+implementation module StdMonad\r