2017-08-01 5 views
-1

私が選択肢を見るときに考えた最初のことは、基本的にはml形式の言語からの多分モナドであるということでした。しかし、真のモナドは物を二重に包むべきではありません(m(m(a)) == m(a))。どのような状況では、リンクされたリスト構造ではなく、2つのオプションが必要でしょうか?スイフトはなぜダブルオプションを許可していますか?

「ダブルオプション」とは、String??などのタイプシグニチャを意味します。私の考えでは、これは自動的にString?に変換されるべきです。

+0

あまりにも理論的な質問です。私たちにあなたが「ダブルオプション」で何を意味しているかの迅速な例を与えるように気をつけてください。あなたの質問にそれを含めてください - 私は実際にあなたが偉大な質問の始まりを持っていると思います! – dfd

+5

おそらく関連しています:https://stackoverflow.com/questions/27225232/two-or-more-optionsals-in-swift –

+0

私は、モナドがどんな機会にも平らにされるべきであるという最初の陳述には同意しません。 ?)。 'オプション' 'を持っていて、必要なときにフラット化することができます(' .flatMap() ';一種の" bind ") – werediver

答えて

3

私はこれをSwiftの観点から試してみるつもりです。私のFPの用語が間違っていれば私を許してください。

なぜダブルオプションを使用するのですか?

2つのオプションがよく知られています。オプションでこのキーに値がないことを示すコレクションで、オプションの値も格納されます。ここでは、コレクションまたは要素がゼロを返すかどうかを知ることが重要な場合があります。

let possibleNumbers: [String: Int?] = [:] 
guard let possibleNumber = possibleNumbers["one"] else { 
    print("No number stored") 
} 
guard let number = possibleNumber else { 
    print("Number at key was nil") 
} 

我々は自動的にT?T???????を変換できますか?

いいえ、それはflatMapで実現できます。オプションのレベルごとに新しいマップを追加する必要があります。

possibleNumbers["one"].flatMap { $0 } 

また、スウィフトOptionalは明示的にモナドと呼ばれているとは思いません。これは内部的に一般的な列挙型として実装され、その型のセマンティクスをより厳密に従います。少なくとも私は言語ガイドで参考文献を見つけることができませんhttps://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html

+0

私はあなたがどこにいても明示的にモナドと呼ばれていないということは正しいと思います。私は深刻なネストされていない問題は、これについて私を気にさせるものだと思うが、あなたはそれをユースケースにした。 –

+0

非公式には、オプションではモナドであることがウェブ上で時々主張されています。ここには著名な情報源があります:http://chris.eidhof.nl/post/monads-in-swift/ 'Optional >'を直接返すだけでは、ルックアップの唯一の解決策ではありません。帯域外信号を使用することができます。例えば、Python辞書は 'None'を含むことができますが、' None'は別の値をラップすることはできません。したがって、失敗したルックアップは "例外"を引き起こします(PythonではSwiftとはまったく異なって使用されます)。それは疑いの余地のないものです... @Sam –

+0

これが作物をする別の場所はイテレーターです。 SwiftとPythonは実際これに非常によく似たプロトコルを持っています。もう一度、違いは、Swiftは任意の(オプションの別のものをラップするかもしれない)を使って終わりを知らせるのに対して、Pythonは 'StopIteration'例外を使います。 –

関連する問題