{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"(>>-) :: forall r a. MCont r a -> (a -> r) -> r"
],
"text/plain": [
"(>>-) :: forall r a. MCont r a -> (a -> r) -> r"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"newtype MCont r a = MCont { (>>-) :: (a -> r) -> r }\n",
"\n",
":t (>>-)\n",
"\n",
"instance Functor (MCont r) where\n",
" fmap f cra = MCont $ \\k -> cra >>- \\a -> k (f a)\n",
" \n",
"instance Applicative (MCont r) where\n",
" pure a = MCont $ \\aTor -> aTor a\n",
" cf <*> cx = MCont $ \\bTor ->\n",
" cx >>- \\a ->\n",
" cf >>- \\f ->\n",
" bTor (f a)\n",
" \n",
"instance Monad (MCont r) where\n",
" return = pure\n",
" cra >>= f = MCont $ \\bTor ->\n",
" cra >>- \\a ->\n",
" (f a) >>- \\b ->\n",
" bTor b\n",
" \n",
"join' :: MCont r (MCont r a) -> MCont r a\n",
"join' ccx = MCont $ \\k ->\n",
" ccx >>- \\cx -> -- extract inner continuation\n",
" cx >>- \\x -> -- extract value of inner continuation\n",
" k x -- wrap value in k again"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"square :: Int -> MCont r Int\n",
"square x = MCont $ \\k -> k (x ^ 2)\n",
"\n",
"add :: Int -> Int -> MCont r Int\n",
"add x y = MCont $ \\k -> k (x + y)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"pythagoras :: Int -> Int -> MCont r Int\n",
"pythagoras x y = do\n",
" xsquare <- square x\n",
" ysquare <- square y\n",
" add xsquare ysquare"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Haskell",
"language": "haskell",
"name": "haskell"
},
"language_info": {
"codemirror_mode": "ihaskell",
"file_extension": ".hs",
"name": "haskell",
"pygments_lexer": "Haskell",
"version": "8.6.5"
}
},
"nbformat": 4,
"nbformat_minor": 4
}