在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 . >>=