Monads of program skeleta

Version on this page:
LTS Haskell 8.5:0.1.3
Stackage Nightly 2017-03-20:
Latest on Hackage:
BSD3 licensed by Fumiaki Kinoshita
Maintained by Fumiaki Kinoshita

Module documentation for


Build Status Hackage

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 :: Interacton 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
Depends on:
comments powered byDisqus