ある種のモナディック法に従うデータ構造/計算のリストは非常に豊富です。
これは、オプションのデータ('a option
F#)、継続、マルチスレッドのリストから、パーサーのような非常に複雑なものまで到達します。
それらのいくつかの実装を開始するだけです。基本的な演習:
// 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は任意のモナドの一般的なインターフェイスを導入しています計算。それらを試すのに最適です!