標準のF#ライブラリにオプション(多分)wokflow(モナド)はありますか?
このワークフローの手作りの実装(1、2)をたくさん見つけましたが、プロジェクトに非標準で信頼性の低いコードを導入したくありません。そして、グーグルとmsdnへの考えられるすべてのクエリは私にそれを見つける手がかりを与えませんでした。
オプション用の標準的な計算ビルダーはありませんが、怠惰のようなものが必要ない場合(リンクした例に追加されているように)、コードは十分に単純なので、それを信頼しない理由はありません(特にOption.bind
標準から示唆に富む名前の関数が与えられます)図書館)。これはかなり最小限の例です:
type OptionBuilder() =
member x.Bind(v,f) = Option.bind f v
member x.Return v = Some v
member x.ReturnFrom o = o
member x.Zero () = None
let opt = OptionBuilder()
標準のF#ライブラリには多分モナドはありません。FSharpxは、F#コミュニティの高度な資格を持つメンバーによって作成されたF#拡張機能であり、非常に多くの有用なモナドがあります。
nugetで利用できるオープンソースライブラリFSharp.Interop.NullOptAbleを作成しました。
オプションワークフローとして機能するだけでなく、nullまたはnull許容ワークフローとしても機能します。
let x = Nullable(3)
let y = Nullable(3)
option {
let! x' = x
let! y' = y
return (x' + y')
} (* |> should equal (Some 6) *)
同様に動作します
let x = Some(3)
let y = Some(3)
option {
let! x' = x
let! y' = y
return (x' + y')
} (* |> should equal (Some 6) *)
あるいは
let x = "Hello "
let y = "World"
option {
let! x' = x
let! y' = y
return (x' + y')
} (* |> should equal (Some "Hello World") *)
そして何かがnull
またはNone
let x = "Hello "
let y:string = null
option {
let! x' = x
let! y' = y
return (x' + y')
} (* |> should equal None *)
最後に、null許容型のものがたくさんある場合は、cexprを使用します。何かがあるchooseSeq {}
場合は、 /それが生成されません。yield!
null
None
ここで他の例を参照してください。