ここはHaskellのExplanation of Monad lawsです。F#のモナド法則の説明
F#でのモナドの法律はどのように説明できますか?
バインド(M、リターン)M.
結合することと等価である((戻りX)、f)はF xと等価です。
bind(m、f)、g)は、bind(m、(fun x - > bind(f x、g)))と同等です。
ここはHaskellのExplanation of Monad lawsです。F#のモナド法則の説明
F#でのモナドの法律はどのように説明できますか?
バインド(M、リターン)M.
結合することと等価である((戻りX)、f)はF xと等価です。
bind(m、f)、g)は、bind(m、(fun x - > bind(f x、g)))と同等です。
私はF#でそれらを理解する良い方法は、計算式の構文を使って何を意味するのかを見ることだと思います。いくつかの計算ビルダーにはm
と書いてありますが、これはasync
または他の計算タイプであると想像することができます。
左アイデンティティ
m { let! x' = m { return x } = m { let x' = x
return! f x' } return! f x' }
右アイデンティティ
m { let! x = comp = m { return! comp }
return x }
アソシエ
m { let! x = comp = m { let! y = m { let! x = comp
let! y = f x return! f x }
return! g y } return! g y }
法律は、通常のF#プログラムをリファクタリングできるように、意味を変えずに一方のバージョンのプログラムを他方のバージョンにリファクタリングできる必要があることを基本的に示しています。
Associativityの例はちょっと混乱します。正しいコード例では 'g'はどうなりましたか?最後の行は 'return! g y '? –
@ChristopherStevensonそのタイプミスを修正するのにわずか4.5年しかかかりませんでした! –
なぜこれに説明が必要ですか?難しい部分はどこですか? –
'bind(M、return)'は正確に 'M 'ではありません。F#が不純なので、バインディングは副作用や突然変異を引き起こす可能性があります。 –
これは正しいですか? – dagelee