延续monad“界面”

时间:2010-04-17 19:09:02

标签: haskell monads continuations state-monad

状态monad“界面”

class MonadState s m where
    get :: m s
    put :: s -> m ()

(+ return and bind)允许使用State monad构造任何可能的计算而不使用State构造函数。例如,State $ \s -> (s+1, s-1)可以写为

 do s <- get
    put (s-1)
    return (s+1)

类似地,我永远不必使用Reader构造函数,因为我可以使用askreturn(>>=)来创建计算。确切地说:Reader f == ask >>= return . f

对于continuation来说是否同样如此 - 是否可以使用Cont r acallCC中唯一的函数)编写MonadCont的所有实例,返回并绑定,并且永远不要输入内容比如Cont (\c -> ...)

1 个答案:

答案 0 :(得分:7)

我不这么认为。看看类型:

Cont :: ((a -> r) -> r) -> Cont r a
callCC :: ((a -> Cont r b) -> Cont r a) -> Cont r a

如果您只有callCC,那么任何地方都不会使用r作为类型 - 它可以是任何类型。所以我不知道如何翻译将其用作类型的东西,例如:

Cont (const 42) :: Cont Int a

如果我只有r,我就无法约束callCC

无论如何,这是我的预感。不是非常严谨,但似乎令人信服。