@hackage monad-skeleton0.1.4
Monads of program skeleta
Installation
Tested Compilers
Dependencies (1)
Dependents (6)
@hackage/objective, @hackage/typesafe-precure, @hackage/acme-everything, @hackage/extensible, @hackage/takahashi, @hackage/extensible-skeleton
monad-skeleton
This package provides Skeleton, an operational monad. The internal encoding
gives O(1) bind and monadic reflection.
Skeleton promotes unit instructions to a monad. It is isomorphic to
MonadView (Skeleton t):
data MonadView t m x where
Return :: a -> MonadView t m a
(:>>=) :: !(t a) -> (a -> m b) -> MonadView t m b
boned :: MonadView t (Skeleton t) a -> Skeleton t a
debone :: Skeleton t a -> MonadView t (Skeleton t) a
GADTs are handy to define instructions:
data Interaction x where
Get :: Interaction String
Put :: String -> Interaction ()
echo :: Skeleton Interaction ()
echo = bone Get >>= bone . Put
Use debone to interpret a computation.
interpret :: Skeleton Interaction a -> IO a
interpret m = case debone m of
Return a -> return a
Get :>>= k -> getLine >>= interpret . k
Put s :>>= k -> putStrLn s >>= interpret . k