Skip to content

Instantly share code, notes, and snippets.

@horus
Last active August 29, 2015 14:04
Show Gist options
  • Save horus/597548dabdca7a059f75 to your computer and use it in GitHub Desktop.
Save horus/597548dabdca7a059f75 to your computer and use it in GitHub Desktop.
Pure IO
import Control.Applicative (Applicative(..))
import Control.Monad (ap)
data MyIO a = Return a
| Get (String -> MyIO a)
| Put String (MyIO a)
instance Functor MyIO where
fmap f (Return a) = Return (f a)
fmap f (Get g) = Get (fmap f . g)
fmap f (Put a io) = Put a (fmap f io)
instance Applicative MyIO where
pure = return
(<*>) = ap
instance Monad MyIO where
return = Return
(Return a) >>= f = f a
(Get f) >>= g = Get (\x -> f x >>= g)
(Put s io) >>= f = Put s (io >>= f)
run :: (Read a, Show a) => MyIO a -> IO a
run (Return a) = return a
run (Get f) = getLine >>= run . f
run (Put a io) = putStr a >> run io
get :: MyIO String
get = Get Return
put :: String -> MyIO ()
put s = Put s (Return ())
example :: MyIO ()
example = do
put "A:\n"
x <- get
put $ "B: " ++ x ++ "\n"
main :: IO ()
main = run example
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment