variant m :: MyMonad where { unit :: a -> m a; bind :: m b -> (b -> m a) -> m a }; {- variant m :: MyMonad => m :: MyMonad0 where { Fail :: m a }; -} record m :: ToMaybe where { toMaybe :: m a -> Maybe a }; instance MyMonad :: m :: ToMaybe where { toMaybe (unit a) = Just a; toMaybe (bind m k) = case toMaybe m of { Nothing -> Nothing; Just b -> toMaybe (k b) } }; -- foo = toMaybe (Bind (Unit 1) (\ x -> Unit (x + 2))); variant m :: MyMonad => m :: ContMonad r where { callCC :: ((a -> m b) -> m a) -> m a; mkCont :: ((a -> r) -> r) -> m a }; record m :: ToCont r where { toCont :: m a -> (a -> r) -> r }; instance MyMonad :: m :: ToCont r where { toCont (unit a) = \ c -> c a; toCont (bind m k) = \ c -> (toCont m) (\ a -> (toCont (k a)) c) }; instance ContMonad r :: m :: ToCont r where { toCont (mkCont m) = m; toCont (callCC h) = \ c -> let { k = \ a -> mkCont (\ d -> c a) } in toCont (h k) c }; bar = toCont (callCC (\ k -> bind (unit 1) (\ x -> k 2)));