回答:
F#のOption
型に関するドキュメントを読むと、Maybe
Haskell の型とほぼ同じように動作し、 'nothing'(None
F#、Nothing
Haskell)、または引数型の値(Some
F#、Just
ハスケルで)。
ただし、HaskellではMaybe
モナドでもあり、配管はMaybe
値の計算を可能にするものNothing
であり、計算内のいずれかの変数がの場合は早期に戻りますNothing
。この方法で使用されるのMaybe
は、単純なエラーハンドラー(またはエラーを無視するデバイス)であり、それがモナドであるという事実により、ボイラープレートを邪魔にならないように移動できます。見てください、このWikipediaの記事素敵な簡潔な例のために。私はOption
この種のモナドの使用法をサポートしていないと思います(実際、F#にモナドの明示的な概念があるかどうか疑問に思っています)。.NETでこの動作が必要な場合はOption.Value
、すべての引数に使用し、計算全体をtry / catch onでラップすると思いますNullReferenceException
。
したがって、Option
はMaybe
typeに似ていますが、Maybe
モナドと同等ではありません。
Monad
typeclassの型です。Maybe
プレーンな古いデータ型ですがMonad
、この「特別な」動作を提供するために実装されることもあります。
map
とbind
関数は、HaskellのMaybe fmap
とbind
関数と同じように動作します。それらは両方ともモナドであり、同等のモナドの振る舞いを持っています。HaskellにはMonad
モナドを操作できる型クラスがあるだけですが、F#では抽象的な「デザインパターン」に似ています。
はい、Option
型と一緒にOption.bind
型コンストラクターという意味で同等ですSome
がモナドを構成する。
モナドの間(のように Monad
typeclassのように)はHaskellsのアイデンティティの中心的な部分ですが、概念的な観点から見ると、それらは言語にとらわれない構成要素です。お好みでデザインパターン。タイプがあり、特定の一連の法則に従う特定のシグネチャを持つバインドおよび戻り関数がある場合-使用する言語に関係なく、モナドがあります。
F#計算式は、Haskellのdo表記と同様に、モナドにプログラム可能な構文糖のみを提供します。何もありませんしながら、Option
箱から出して計算式ビルダーは、簡単にこのような最低限のものを定義することができます。
type OptionBuilder () =
member this.Bind(m, f) = Option.bind f m
member this.Return(a) = Some a
let option = OptionBuilder ()
次のように使用します。
let c =
option {
let! a = Some 4
let! b = None
return a + b
}
これは、次のようなものに相当します。
let c =
(Some 4)
|> Option.bind (fun a ->
None
|> Option.bind (fun b ->
Some (a + b)))
ビルダーメンバーがどのように型Monad
クラスをミラーリングするか、そして、たとえ複雑な場合でも、ビルダーなしでコードをモナディックに記述できることに注意してください。
それらは同等であり、両方ともモナドです。違いはモナドであることはHaskellで何かを意味することです-明示的な型Monad
クラスがあり、モナディックコードを書くときに多くのボイラープレートを排除するために「表記法」を使用できます。F#では、ビルダー表記法と、let!
およびdo!
同様のボイラープレートを取り除くために使用できますが、「モナドである」という型の明示的な概念はありません。Haskellの型システムには、型Monad
クラス(一般クラスがある)とより高い種類の型(個人クラスがある)Monad
が含まれ、すべてのモナドで機能するコードを記述できます。F#の型システムには、これらの機能はありません。
つまり、F#Option
とHaskell Maybe
は同一であり、どちらもモナドです。Haskellがモナドを操作するための機構をF#よりもはるかに多く提供しているだけです。
that's not the case
?彼らは私に非常に似ています。