{ "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 }