7

新しいプログラミングの主題について学ぶとき、私は通常、パターンに従います。私はそれについて読み、理解し、次にいくつかの例をコーディングして、実際にそれを取得できるようにします。

私はモナドについてたくさん読んだことがあり、それらを理解して理解していると確信しています。私は今、理解を固めるためにいくつかのモナドをコード化して、さまざまなタイプのバインドを実装するために何が必要かを本当に理解したい段階にあります。

問題は、実装する明らかなモナドがあまり考えられないことです。そのため、推奨事項を探しています。できれば、簡単なものとそうでないものを含めた推奨事項のリストが欲しいです。

また、モナドは関数型プログラムで副作用を「カプセル化」するために使用されますが、それよりも一般的であることも認識しています。したがって、副作用といくつかの一般的な副作用の両方をカプセル化するモナドを含めることをお勧めします。

ありがとう!

(補足として:これを行うためにf#を使用しますが、この質問はすべての関数型言語に当てはまると思います)。

4

3 に答える 3

5

All About Monadsのカタログは良いスタートだと思います(継続モナドは実際にはカタモルフィズムに役立ちます。たとえば、ここを参照してください)。さらに、パーサー、および場合によってはトランザクション効果非同期は、自分で実装しようとするもう1つの優れた方法です(論理的には、異なる実際のスレッド間をホップして非ブロッキングになるシングルスレッドコード)。そして、リアクティブフレームワークの根底にあるモナドは、優れた高度な課題のように見えます。

于 2009-10-03T22:46:53.543 に答える
2

ある種のモナディック法に従うデータ構造/計算のリストは非常に豊富です。

これは、オプションのデータ('a optionF#)、継続、マルチスレッドのリストから、パーサーのような非常に複雑なものまで到達します。

それらのいくつかの実装を開始するだけです。基本的な演習:

// Identity monad

let something = ident {
    let! value = id 42
    return value
}

let somethingelse = ident {
    let! value = something
    let! otherValues = id 40
    return value + othervalue
}


// Implement maybe for 'a option
let sum = maybe {
    let! a = maybeInputNumber("a")
    let! b = maybeInputNumber("b")
    let! c = maybeInputNumber("c")
    return a + b + c
}

match sum with
| None -> ...
| Some(n) -> ...

ヘルパー関数と明示的なモナディック構文を使って少しだけ演奏することで、理解を深めることもできます。

// Given m >>= f for m.Bind(f)

let (>-) f monad = monad >>= (fun k -> return(f x))

// What's this?
let res = ((+) 1) >- [1..10]

いくつかの複雑な例が必要な場合は、モナディックパーサーコンビネーターを見てください。これにより、複雑な再帰下降パーサーをプレーンなF#で実装できるようになります(FParsec -Projectをご覧ください)

let parseVector = parser {
    do! ignore $ char '('
    let! [x;y;z] = sepBy parseNumber "," 
    do! ignore $ char ')'
    return new Vector(x, y, z)
}

このための簡単な実装は、次のタイプに基づいています。

type 't Computation = 
    | Error of ...
    | Result of 't

type Input     = char list
type 'a Parser = Input -> (('a * Input) Computation)

バインドリターンを実装してみてください;-)

そして一般的なヒントとして:自然環境でモナドを本当に理解したい場合は、Haskellを使用する必要があります;-) F#には計算式だけがあり、漠然としたアナログですが、Haskellは任意のモナドの一般的なインターフェイスを導入しています計算。それらを試すのに最適です!

于 2009-10-03T16:35:43.267 に答える
1

Haskellがモナドについて学ぶための自然言語であるという事実に異議を唱えることはないと思いますが、非常に役立つ演習は、箱から出してHaskellのようなスーパーを持たない言語にモナド計算をもたらすことです。それらのスムーズなサポート。それはどの言語でも完全に可能であり、合理的に高水準の言語であれば、おそらく創造的で実際に見栄えを良くすることが可能です-その過程で多くのことを学びます!たとえば、 Pythonのクールなモナディック構文を見てきました(ValuedLessonsで)。

Lispでモナドを使用するための優れた機能を提供するClojureのclojure.contrib.monadsライブラリもあります。その機能の一部を再現しようとすると、非常に有益な場合があります。また、Haskellの代わりに使用すると、一般的なパターンをHaskellの構文の詳細から切り離すのに役立つ場合があります(確かに、それらは非常に優れていますが)。

于 2009-12-19T05:05:58.540 に答える