gpt4 book ai didi

scala - 如果 `for` 中的至少一个组件为 None,则 for-comprehension 返回 None

转载 作者:行者123 更新时间:2023-12-02 00:18:59 25 4
gpt4 key购买 nike

我很难理解在 Scala 中使用 for-compression 的机制。例如,如果我有

val x = for {
i <- Option(1)
j <- Option(2)
k <- Option(3)
} yield (i,j,k)

xx: Option[(Int, Int, Int)] = Some((1,2,3))。但是,如果至少有一个组件是 None,例如,

val x = for {
i <- Option(1)
j <- Option(2)
k <- None
} yield (i,j,k)

然后 xx: Option[(Int, Int, Nothing)] = None,而我实际上希望看到类似这样的内容:x: Option [(Int, Int, Nothing)] = Some((1,2,None))

我检查了 FAQ from Scala official documentation其中特别指出for-comprehensionflatmapmap的组合。但是我仍然很难理解 xNone

我想我错过了一些关于 flatmapmap 区别的重要概念。

最佳答案

第一个 for-comprehension“脱糖”为:

val x = Option(1).flatMap(
i => Option(2).flatMap(
j => Option(3).map(
k => (i, j, k)
)
)
)

如您所见 - 第一个选项使用一个函数进行平面映射,该函数获取其值(如果存在)并返回一个三元组(对第二个选项使用类似的操作)。不管那个函数是什么 - 整个表达式都是以下形式:

val x = Option(1).flatMap(f)

现在,如果我们将 Option(1) 替换为 None(就像您在第二个表达式中所做的那样),我们显然会得到 None:

val x = None.flatMap(f) // None, for any f

您期望的结果 (Some((None, 2, 3))) 不是很有用 - 因为对于不同的输入它会有不同的类型:是 (Option[Int], Int, Int)?还是 (Int, Int, Int)?还是 (Option[Int], Option[Int], Option[Int])(None, 2, 3)(1, None, 3)(1, 2, None) 的唯一通用类型是不太有用的 (Any, Any, Any)

关于scala - 如果 `for` 中的至少一个组件为 None,则 for-comprehension 返回 None,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56138004/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com