在tutorial继续,在第一个更复杂的副作用:随机数我来到这所:为什么随机绑定的类型需要额外的StdGen?
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)
我的理由去如下:
- 绑定需要一个功能
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 . >>=