Advertisement
Guest User

Untitled

a guest
Feb 27th, 2017
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.66 KB | None | 0 0
  1. import System.Exit
  2. import Control.Monad
  3. import Control.Monad.Free
  4.  
  5. data TeletypeF next = Say String next | Ask (String -> next) | Stop
  6.  
  7. instance Functor TeletypeF where
  8. fmap f (Say msg next) = Say msg (f next)
  9. fmap f (Ask k) = Ask (f . k)
  10. fmap _ Stop = Stop
  11.  
  12. type Teletype = Free TeletypeF
  13.  
  14. example :: Teletype ()
  15. example = Free $ Say "What is your name?" $ Free $ Ask $ \name ->
  16. if (length name >= 10) then Pure ()
  17. else Free $ Say ("Hello, " ++ name ++ "!") (Pure ())
  18.  
  19. runIO :: Teletype a -> IO a
  20. runIO (Pure r) = return r
  21. runIO (Free (Say msg t)) = print msg >> runIO t
  22. runIO (Free (Ask f)) = getLine >>= runIO . f
  23. runIO (Free Stop) = exitSuccess
  24.  
  25. main = runIO example
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement