多分モナドはオプションの種類とどのように関係していますか?


8

私はF#に関するプレゼンテーションを行っていて、聴衆の誰かがオプションタイプがF#の多分モナドの実装であるかどうか尋ねたときに、オプションタイプについて話していました。そうではないことはわかっていますが、2つの概念がどのように関連しているかを確認したいと思いました。オプションのタイプがたぶんモナドの演算の結果かもしれないと私には思えますが、私はそれについてさえ確信がありません。

多分モナドとそれをサポートする関数型言語のオプション型の関係を誰かが解明するでしょうか?


4
気になるだけですが、どうやって知っていますかthat's not the case?彼らは私に非常に似ています。

それが私が求めている理由です。
オノリオカテナッチ

回答:


8

F#のOption型に関するドキュメントを読むと、MaybeHaskell の型とほぼ同じように動作し、 'nothing'(NoneF#、NothingHaskell)、または引数型の値(SomeF#、Justハスケルで)。

ただし、HaskellではMaybeモナドでもあり、配管はMaybe値の計算を可能にするものNothingであり、計算内のいずれかの変数がの場合は早期に戻りますNothing。この方法で使用されるのMaybeは、単純なエラーハンドラー(またはエラーを無視するデバイス)であり、それがモナドであるという事実により、ボイラープレートを邪魔にならないように移動できます。見てください、このWikipediaの記事素敵な簡潔な例のために。私はOptionこの種のモナドの使用法をサポートしていないと思います(実際、F#にモナドの明示的な概念があるかどうか疑問に思っています)。.NETでこの動作が必要な場合はOption.Value、すべての引数に使用し、計算全体をtry / catch onでラップすると思いますNullReferenceException

したがって、OptionMaybe typeに似ていますが、Maybe モナドと同等ではありません。


明快な説明をありがとう。率直に言って、私は常にそれらが同じではないと考えました(1つはタイプでもう1つはモナドです)。
Onorio Catenacci

ところで、F#には概念のモナドタイプがあります。それは計算式と呼ばれます。
Onorio Catenacci

@OnorioCatenacci:ああ、そうか。私はF#にあまり触れたことがないので、すみません。とにかく、Haskellでは、モナド型、より具体的にはMonadtypeclassの型です。Maybeプレーンな古いデータ型ですがMonad、この「特別な」動作を提供するために実装されることもあります。
tdammers 2012年

2
要するに、私はそれらが同等ではないことにまったく同意しません。型クラスやポリモーフィズムなどの言語構造は、型の基本的な数学的特性と構造を変更しません。
サラ

2
F#のオプションmapbind関数は、HaskellのMaybe fmapbind関数と同じように動作します。それらは両方ともモナドであり、同等のモナドの振る舞いを持っています。HaskellにはMonadモナドを操作できる型クラスがあるだけですが、F#では抽象的な「デザインパターン」に似ています。
Jack

9

はい、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クラスをミラーリングするか、そして、たとえ複雑な場合でも、ビルダーなしでコードをモナディックに記述できることに注意してください。


3

それらは同等であり、両方ともモナドです。違いはモナドであることはHaskellで何かを意味することです-明示的な型Monadクラスがあり、モナディックコードを書くときに多くのボイラープレートを排除するために「表記法」を使用できます。F#では、ビルダー表記法と、let!およびdo!同様のボイラープレートを取り除くために使用できますが、「モナドである」という型の明示的な概念はありません。Haskellの型システムには、型Monadクラス(一般クラスがある)とより高い種類の型(個人クラスがある)Monadが含まれ、すべてのモナドで機能するコードを記述できます。F#の型システムには、これらの機能はありません。

つまり、F#OptionとHaskell Maybeは同一であり、どちらもモナドです。Haskellがモナドを操作するための機構をF#よりもはるかに多く提供しているだけです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.