为什么Swift允许双重选择?

时间:2017-08-01 14:20:05

标签: swift monads

在看到期权时我想到的第一件事是它基本上是来自ml风格语言的Maybe monad。但是,真正的monad不应该对事物进行双重包装(m(m(a)) == m(a))。在什么情况下你想要一个双重可选而不是一个链表结构?

“双重可选”,我的意思是String??或类似的类型签名。在我看来,这应该自动转换为String?

1 个答案:

答案 0 :(得分:5)

我将尝试从Swift的角度回答这个问题,如果我的FP术语不正确,请原谅我。

为什么我会使用双重期权?

有一个众所周知的双重可选案例。一个使用optional的集合,表示此键没有值,它也存储可能是可选的值。在这里,了解集合或元素是否返回nil可能很重要。

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 }

我也不相信Swift Optional被明确地称为monad。它在内部实现为通用枚举,它更紧密地遵循该类型的语义。至少我在语言指南https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html

中找不到任何参考