【发布时间】:2012-07-26 17:12:38
【问题描述】:
继续tutorial,在更复杂的副作用:随机数部分我来了:
bind :: (a → StdGen → (b,StdGen)) → (StdGen → (a,StdGen)) → (StdGen → (b,StdGen))
当“随机函数”的类型(作者称之为)如下:
a → StdGen -> (b,StdGen)
此外,绑定定义为:
bind f x seed = let (x',seed') = x seed in f x' seed'
问题:为什么绑定的签名末尾有一个额外的StdGen?不应该是:
bind :: (a → StdGen → (b,StdGen)) → (StdGen → (a,StdGen)) → (b,StdGen)
我的推理如下:
- Bind 采用函数
f:: a -> StdGen -> (b,StdGen)和“输出”StdGen -> (a,StdGen)。 -
它将
f应用于a和StdGen,并返回f的签名所表示的任何内容——即(b, StdGen):f::a -> StdGen -> (b,StdGen) -
即使在绑定实现之后,
f也会同时应用于x'和seed'类型的StdGen,因此它的结果必须是一个元组!bind f x seed = let (x',seed') = x seed in f x' seed'
我哪里出错了?任何帮助表示赞赏!
注意:对于未来的读者,作者对bind 的定义与标准定义相同,只是参数翻转了:flip . >>=
【问题讨论】: