从这个线程(Control.Monad.Cont fun,2005),Tomasz Zielonka介绍了一个函数(由ThomasJäger以清晰而美观的方式评论).Tomasz接受callCC主体的参数(函数)并返回它以供以后使用,具有以下两个定义:
import Control.Monad.Cont
...
getCC :: MonadCont m => m (m a)
getCC = callCC (\c -> let x = c x in return x)
getCC' :: MonadCont m => a -> m (a, a -> m b)
getCC' x0 = callCC (\c -> let f x = c (x, f) in return (x0, f))
Run Code Online (Sandbox Code Playgroud)
这些也在Haskellwiki中提到过.使用它们,你可以像haskell中的goto语义看起来非常酷:
import Control.Monad.Cont
getCC' :: MonadCont m => a -> m (a, a -> m b)
getCC' x0 = …Run Code Online (Sandbox Code Playgroud) 在不同的问题上,我发现了关于使用(->)Monads实例的评论中的提示,例如用于实现无点样式.
至于我,这有点过于抽象.好吧,我已经看到了Arrow实例,在(->)我看来,它(->)可以在实例表示法中使用,但不能在类型声明中使用(这可能只是另一个问题的东西).
有没有任何例子使用(->)Monad的例子?还是一个很好的链接?
很抱歉,如果这个问题可能已经在这里讨论过,但是搜索" (->)Monad实例"会给你很多次点击,因为你可以想象......因为几乎所有关于Haskell的问题都涉及到(->)"Monad".
我尝试为Continuation Monad Transformer的MonadWriter创建一个派生实例.这是我尝试的方式:
{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, UndecidableInstances #-}
import Control.Monad.Cont
import Control.Monad.Writer
instance (MonadWriter w m) => MonadWriter w (ContT r m) where
   tell= lift . tell
   listen m= ContT $ \ c -> do
         (a,w) <- listen $ runContT m (c)
         return (a,w)
   pass m = undefined
Run Code Online (Sandbox Code Playgroud)
这给了我以下错误:
Occurs check: cannot construct the infinite type: r = (r, w1)
When generalising the type(s) for `listen'
In the instance declaration for `MonadWriter w (ContT r m)'
Run Code Online (Sandbox Code Playgroud)
接下来尝试是这样的:
instance (MonadWriter …Run Code Online (Sandbox Code Playgroud)