これは、LangExt.Compatibility.FSharpの概要を説明するドキュメントです。
LangExt.Compatibility.FSharpは、LangExtを用いたC#のコードとF#のコードを繋ぐためのライブラリです。
LangExt.Compatibility.FSharpの機能のみをF#から利用する場合、 必要にならない限りLangExtをopenせず、LangExt.Compatibility.FSharpのみをopenしてください。
C#からこのライブラリを利用することは現状であまり考えていませんが、 今後は何かしらの対応を入れる可能性はあります。
LangExt.Compatibility.FSharpが提供する主な機能について、その役割や意味を簡単に説明します。 実際の使い方に関しては、ドキュメンテーションコメント等を参考にしてください。
LangExt.Compatibility.FSharpでは、LangExtが提供する型のうちOptionとResultにそれぞれ、 CsOption
、CsResult
という別名を提供しています。
OptionはF#にも存在するための別名ですが、Resultは標準の範囲ではF#にはありません。 しかし、他のF#ライブラリで提供されることが考えられるため、別名を用意しています。
CsOptionモジュールにLangExtのOptionを生成するための関数があります。
let f x =
if x = 0 then CsOption.none else CsOption.some x
LangExtのOptionに対してアクティブパターンを提供しており、match式で使用可能です。
match opt with
| CsSome v -> sprintf "%A" v
| CsNone -> "none"
LangExtのResultに対してアクティブパターンを提供しており、match式で使用可能です。
match res wit
| CsSuccess x -> sprintf "%A" x
| CsFailure x -> sprintf "%A" x
CsOptionモジュールとFsOptionモジュールに、LangExtのOptionとF#のOptionの相互変換を行うための関数があります。
LangExtのOptionからF#のOptionに変換する場合、CsOption.toFsOption
か、FsOption.ofCsOption
を使います。 この2つはまったく同じ機能を持ちますが、語順を意識してより自然に見えるように使い分けましょう。
(* 自然な語順 *)
let f (x: CsOption<'a>) =
x |> CsOption.toFsOption |> Option.get
(* 不自然な語順 *)
let g (x: CsOption<'a>) =
x |> FsOption.ofCsOption |> Option.get
このように、パイプライン演算子を使う場合はCsOption.toFsOption
を使うほうが自然です。 それに対して、
(* 自然な語順 *)
let f (x: CsOption<'a>) =
let opt = FsOption.ofCsOption x
Option.get opt
(* 不自然な語順 *)
let g (x: CsOption<'a>) =
let opt = CsOption.toFsOption x
Option.get opt
のように、関数適用の形で使う場合はFsOption.ofCsOption
を使うほうがより自然になります。
これらの逆の変換を行うFsOption.toCsOption
と、CsOption.ofFsOption
も定義されています。