为什么 Swift 允许双重可选?
Why does Swift allow double optionals?
当我看到 optionals 时,我首先想到的是它基本上是来自 ml 风格语言的 Maybe monad。然而,一个真正的 monad 不应该对事物进行双重包装 (m(m(a)) == m(a)
)。在什么情况下你想要双可选而不是链表结构?
"double optional" 是指 String??
或类似的类型签名。在我看来,这应该会自动转换为 String?
.
我将尝试从 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 { [=11=] }
我也不相信 Swift Optional
曾被明确称为 monad。它在内部作为通用枚举实现,并且更紧密地遵循该类型的语义。至少我在语言指南中找不到任何参考 https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html
当我看到 optionals 时,我首先想到的是它基本上是来自 ml 风格语言的 Maybe monad。然而,一个真正的 monad 不应该对事物进行双重包装 (m(m(a)) == m(a)
)。在什么情况下你想要双可选而不是链表结构?
"double optional" 是指 String??
或类似的类型签名。在我看来,这应该会自动转换为 String?
.
我将尝试从 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 { [=11=] }
我也不相信 Swift Optional
曾被明确称为 monad。它在内部作为通用枚举实现,并且更紧密地遵循该类型的语义。至少我在语言指南中找不到任何参考 https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html