Skip to content

Instantly share code, notes, and snippets.

@scturtle
Created January 26, 2016 15:37
Show Gist options
  • Select an option

  • Save scturtle/107d246d982ac59b39ab to your computer and use it in GitHub Desktop.

Select an option

Save scturtle/107d246d982ac59b39ab to your computer and use it in GitHub Desktop.
Control.Monad.Trans.Cont
newtype ContT r m a = ContT { runContT :: (a -> m r) -> m r }
instance Functor (ContT r m) where
-- :: (a -> b) -> ContT r m a -> ContT r m b
fmap a2b ca = ContT $ \b2r -> runContT ca (b2r . a2b)
instance Applicative (ContT r m) where
-- :: a -> ContT r m a
pure a = ContT $ \a2r -> a2r a
-- :: ContT r m (a -> b) -> ContT r m a -> ContT r m b
ca2b <*> ca = ContT $ \b2r ->
runContT ca2b $ \a2b ->
runContT ca $ \a -> b2r (a2b a)
instance Monad (ContT r m) where
-- :: ContT r m a -> (a -> ContT r m b) -> ContT r m b
ca >>= a2cb = ContT $ \b2r ->
runContT ca $ \a ->
runContT (a2cb a) b2r
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment