Functional programming Wadler和#xBB中蜱虫方程的问题;函数式编程的单子«;,第三节

Functional programming Wadler和#xBB中蜱虫方程的问题;函数式编程的单子«;,第三节,functional-programming,monads,state-monad,Functional Programming,Monads,State Monad,在瓦德勒的书中,我在看等式 滴答声✭ λ().m=m✭ λ().滴答声 在第3节中(在状态Monad的上下文中)。据说它 只要勾号是m中状态的唯一动作,则保持不变 我不明白怎么会是这样。左边的项不是有m的类型,而右边的项有tick:m()的类型吗?此外,如果m的类型不是m(),则✭ 在右侧不匹配 我环顾四周,但找不到任何勘误表,同样的方程式出现在2001年的论文修订版中,所以肯定有我遗漏的东西…在Haskell语法中 勾选x=((),x+1) 美国a x=(a,x) bindState m k=

在瓦德勒的书中,我在看等式

滴答声✭ λ().m=m✭ λ().滴答声

在第3节中(在状态Monad的上下文中)。据说它

只要勾号是m中状态的唯一动作,则保持不变

我不明白怎么会是这样。左边的项不是有m的类型,而右边的项有tick:m()的类型吗?此外,如果m的类型不是m(),则✭ 在右侧不匹配

我环顾四周,但找不到任何勘误表,同样的方程式出现在2001年的论文修订版中,所以肯定有我遗漏的东西…

在Haskell语法中

勾选x=((),x+1)
美国a x=(a,x)
bindState m k=未修剪的k。m——状态的StarOp
bindState勾号(\()->m)=
=未修剪(\()->m)。(\x->((),x+1))
=(\y->uncurry(\()->m)(\x->((),x+1))y)
=(\y->uncurry(\()->m)((),y+1))
=(\y->(\()->m)((y+1))
=(\y->m(y+1))
bindState m(\()->勾号)=
=未修剪(\()->勾号)。M
=未修剪(\()->(\x->((),x+1)))。M
=未修剪(\()x->((),x+1))。M
=(\y->uncurry(\()x->((),x+1))(my))
=(\y->let((),z)=m y in((),z+1))
只有当
my
返回
((),z)
使得
m(y+1)
返回
((),z+1)
(即
my
仅向初始状态
y
添加一些固定量,这不依赖于
y

所以我看不出类型有什么问题,但我也不明白这个英语短语的意思

顺便说一句,该论文提出的将“执行计数”添加到其一元求值器的方法是,将这个
单位状态
更改为
单位状态a x=(a,x+1)
,本质上,这将使它成为非法的一元,因为这个新的
单位状态
不会是一个身份

类型是,

勾选::M()
bindState::MA->(a->MB)->MB
(\()->勾选)::()->米()
bindState(tick::M())((\()->M)::()->mb)::mb
bindState(m::m())((\()->勾选)::()->m())::m()

因此,与类型相关的唯一问题是
m
必须是
m::m()
,而不是一般的
mb
,正如我们在上面的扩展中已经看到的那样。

感谢您解决了这个问题!这证实了我的怀疑,即该标识仅适用于
m::m()
,正如您所说,因此在第2.8节的设置中,尤其是在m=单位(a÷b)的情况下。至于你的其他评论,我对给定方程式中“替换单元(a÷b)”的解释是指第2.5节中的程序代码,而不是单元的定义。