gpt4 book ai didi

scala - 为什么 Option 需要在 for 循环中显式地使用 toList?

转载 作者:行者123 更新时间:2023-12-03 23:48:10 27 4
gpt4 key购买 nike

使用带有简单 Option 的 for 循环有效:

scala> for (lst <- Some(List(1,2,3))) yield lst
res68: Option[List[Int]] = Some(List(1, 2, 3))

但是循环 Option 的内容不会:
scala> for (lst <- Some(List(1,2,3)); x <- lst) yield x
<console>:8: error: type mismatch;
found : List[Int]
required: Option[?]
for (lst <- Some(List(1,2,3)); x <- lst) yield x
^

...除非 Option 显式转换为 List:
scala> for (lst <- Some(List(1,2,3)).toList; x <- lst) yield x
res66: List[Int] = List(1, 2, 3)

为什么需要显式列表转换?这是惯用的解决方案吗?

最佳答案

for (lst <- Some(List(1,2,3)); x <- lst) yield x

被翻译成
Some(List(1,2,3)).flatMap(lst => lst.map(x => x))
flatMap方法在 Option期望一个返回 Option 的函数,但您传递的是一个返回 List 的函数并且没有来自 List 的隐式转换至 Option .

现在,如果您转换 Option先到一个列表, flatMap List的方法将被调用,它期望一个函数返回 List ,这就是你传递给它的东西。

在这种特殊情况下,我认为最惯用的解决方案是
Some(List(1,2,3)).flatten.toList

关于scala - 为什么 Option 需要在 for 循环中显式地使用 toList?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13966164/

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