チュートリアルを続けると、セクションA more complex side effect: Random Numbersで次のようになります。
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)。 をandに適用し、
fの署名が示すものは何でも返します- これはちょうど:aStdGenf(b, StdGen)f::a -> StdGen -> (b,StdGen)次の bind 実装で
fも、 valuex'とseed'typeの両方に適用されるStdGenため、結果はタプルでなければなりません!bind f x seed = let (x',seed') = x seed in f x' seed'
どこかで私が間違っていましたか?どんな助けでも大歓迎です!
注: 将来の読者のために、著者の の定義はbind、引数が反転していることを除いて、標準の定義と同等です。flip . >>=