为什么Swift允许双重选择?

Sam*_*ick 2 monads swift

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

通过"双重可选",我的意思是类型签名String??或类似的东西.在我看来,这应该自动转换为String?.

Tri*_*ide 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")
}
Run Code Online (Sandbox Code Playgroud)

我们可以自动转换T???????T?

不,但它可以实现flatMap.虽然您需要为每个级别的可选项添加新地图.

possibleNumbers["one"].flatMap { $0 }
Run Code Online (Sandbox Code Playgroud)

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