2013-09-02 1 views
7

ここはHaskellのExplanation of Monad lawsです。F#のモナド法則の説明

F#でのモナドの法律はどのように説明できますか?

  1. バインド(M、リターン)M.

  2. 結合することと等価である((戻りX)、f)はF xと等価です。

  3. bind(m、f)、g)は、bind(m、(fun x - > bind(f x、g)))と同等です。

+3

なぜこれに説明が必要ですか?難しい部分はどこですか? –

+0

'bind(M、return)'は正確に 'M 'ではありません。F#が不純なので、バインディングは副作用や突然変異を引き起こす可能性があります。 –

+0

これは正しいですか? – dagelee

答えて

10

私は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#プログラムをリファクタリングできるように、意味を変えずに一方のバージョンのプログラムを他方のバージョンにリファクタリングできる必要があることを基本的に示しています。

+2

Associativityの例はちょっと混乱します。正しいコード例では 'g'はどうなりましたか?最後の行は 'return! g y '? –

+1

@ChristopherStevensonそのタイプミスを修正するのにわずか4.5年しかかかりませんでした! –