状态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
构造函数,因为我可以使用ask
,return
和(>>=)
来创建计算。确切地说:Reader f == ask >>= return . f
。
对于continuation来说是否同样如此 - 是否可以使用Cont r a
(callCC
中唯一的函数)编写MonadCont
的所有实例,返回并绑定,并且永远不要输入内容比如Cont (\c -> ...)
?
答案 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
。
无论如何,这是我的预感。不是非常严谨,但似乎令人信服。