延续单子“接口”
状态 monad“接口”
class MonadState s m where
get :: m s
put :: s -> m ()
(+ 返回和绑定)允许使用状态 monad 构造任何可能的计算,而无需使用 State
构造函数。例如,状态 $ \s -> (s+1, s-1)
可以写成
do s <- get
put (s-1)
return (s+1)
类似地,我永远不必使用 Reader
构造函数,因为我可以使用 ask
创建该计算, 返回
和(>>=)
。准确地说:Reader f == Ask >>= return 。 f。
对于延续来说也是如此吗?是否可以使用 callCC
(MonadCont
中的唯一函数)编写 Cont r a
的所有实例,返回并绑定,并且永远不要输入类似 Cont (\c -> ...)
的内容?
The state monad "interface"
class MonadState s m where
get :: m s
put :: s -> m ()
(+ return and bind) allows to construct any possible computation with State monad without using State
constructor. For example, State $ \s -> (s+1, s-1)
can be written as
do s <- get
put (s-1)
return (s+1)
Similarily, I never have to use Reader
constructor, because I can create that computation using ask
, return
and (>>=)
. Precisely: Reader f == ask >>= return . f
.
Is it the same true for continuations - is it possible to write all instances of Cont r a
using callCC
(the only function in MonadCont
), return and bind, and never type something like Cont (\c -> ...)
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我不这么认为。查看类型:
如果您只有
callCC
,则在任何地方都不能使用r
作为类型 - 它可以是任何类型。所以我不知道如何翻译使用它作为类型的东西,例如:如果我只有
callCC
,我就无法约束r
。无论如何,这是我的预感。虽然不是很严格,但看起来很有说服力。
I don't think so. Looking at the types:
If you only have
callCC
, there is no use ofr
as a type anywhere - it could be of any kind. So I don't know how you could translate something that uses it as a type, eg:I have no way of constraining
r
if I only havecallCC
.Anyway, that's my hunch. Not terribly rigorous, but it seems convincing.