チュートリアルを続けると、セクション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
の署名が示すものは何でも返します- これはちょうど:a
StdGen
f
(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 . >>=