10

状态单子“接口”

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

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

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

同样,我永远不必使用Reader构造函数,因为我可以使用ask,return(>>=). 准确地说:Reader f == ask >>= return . f

延续是否也一样——是否可以编写所有Cont r a使用实例callCC(中唯一的函数MonadCont)、返回和绑定,并且从不输入类似的东西Cont (\c -> ...)

4

1 回答 1

7

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

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

如果您只有callCC,则在任何地方都没有使用ras 类型 - 它可以是任何类型。所以我不知道您如何翻译将其用作类型的内容,例如:

Cont (const 42) :: Cont Int a

r如果我只有callCC.

无论如何,这是我的预感。不是很严谨,但似乎很有说服力。

于 2010-04-17T22:23:20.603 回答