状态单子“接口”
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 -> ...)
?