Scala 选项上的flatmap(GenTraversableOnce)

Scala 选项上的flatmap(GenTraversableOnce),scala,Scala,这不起作用: val res = myOption flatMap (value => Seq(value, “blo”)) 但这是肯定的: val res = myOption.toSeq flatMap (value => Seq(value, “blo”)) 你不认为Options上的flatMap应该像Seq一样使用gentraversableone吗? 或者此代码不利于可读性,我应该使用匹配或映射/getOrElse 编辑:我们在/产量上也得到了同样的问题 Cheers

这不起作用:

val res = myOption flatMap (value => Seq(value, “blo”))
但这是肯定的:

val res = myOption.toSeq flatMap (value => Seq(value, “blo”))
你不认为
Option
s上的
flatMap
应该像
Seq
一样使用
gentraversableone
吗?
或者此代码不利于可读性,我应该使用
匹配
映射
/
getOrElse

编辑:我们在/
产量
上也得到了同样的问题


Cheers

选项。flatMap
返回一个
选项,该选项与序列“类似”,但不能包含多个元素。如果允许它接受一个函数,该函数返回一个
Seq
,并且它返回一个包含多个元素的
Seq
,那么
flatMap
的返回值是多少(请记住,它需要是一个
选项

为什么
flatMap
首先需要返回一个选项?好吧,所有的
flatMap
实现都返回它们开始时使用的相同类型。这是有道理的:如果我有一个
选项
,并且想以某种方式转换内容,最常见的用例是我想以另一个
选项
结束。如果
flatMap
返回给我一个
Seq
,我会怎么做<代码>头选项
?这不是一个很好的主意,因为它可能会悄悄地丢弃数据<代码>如果(seq.size<2)seq.headOption else抛出….?好吧,这稍微好一点,但看起来很难看,并且在编译时无法强制执行


另一方面,当您需要时,将
选项
转换为
Seq
非常简单且完全安全:只需执行
.toSeq

Option.flatMap
返回一个
选项,该选项“类似”一个序列,但不能包含多个元素。如果允许它接受一个函数,该函数返回一个
Seq
,并且它返回一个包含多个元素的
Seq
,那么
flatMap
的返回值是多少(请记住,它需要是一个
选项

为什么
flatMap
首先需要返回一个选项?好吧,所有的
flatMap
实现都返回它们开始时使用的相同类型。这是有道理的:如果我有一个
选项
,并且想以某种方式转换内容,最常见的用例是我想以另一个
选项
结束。如果
flatMap
返回给我一个
Seq
,我会怎么做<代码>头选项
?这不是一个很好的主意,因为它可能会悄悄地丢弃数据<代码>如果(seq.size<2)seq.headOption else抛出….?好吧,这稍微好一点,但看起来很难看,并且在编译时无法强制执行


另一方面,当您需要时,将
选项
转换为
Seq
非常简单且完全安全:只需执行
.toSeq

flatMap的总体语义是类似于方法,这意味着它倾向于类似于签名

[A]this:T[A].flatMap[B](f: A => T[B]): T[B]
有时(
SeqLike
)此签名被推广到

[A]this:T[A].flatMap[B](f: A => F[B]): T[B] 
其中
F[B]
是一种很容易转换为
T[B]

因此,不仅
选项
,而且
并发.Future
util.Try
和-extension-syntax for scalaz monad都有方法
flatMap
,该方法不接受任何可遍历,但只接受相同的包装类型


也就是说,
flatMap
更多的是来自monads世界,而不是来自collections

flatMap的总体语义是像方法一样工作,这意味着它倾向于像签名一样工作

[A]this:T[A].flatMap[B](f: A => T[B]): T[B]
有时(
SeqLike
)此签名被推广到

[A]this:T[A].flatMap[B](f: A => F[B]): T[B] 
其中
F[B]
是一种很容易转换为
T[B]

因此,不仅
选项
,而且
并发.Future
util.Try
和-extension-syntax for scalaz monad都有方法
flatMap
,该方法不接受任何可遍历,但只接受相同的包装类型


也就是说,
flatMap
更多的是来自monads world,而不是来自collections

“记住它需要成为一个选项”为什么?为什么我可以做
Seq().flatMap(Option())
,但反过来不行?如果它使用GenTraversableOne,它将处理所有收集,包括Options@Joan我在回答中添加了对您评论的回应非常好的回答谢谢@Dima。我现在了解了问题的各个方面。“记住它需要成为一个选项”为什么?为什么我可以做
Seq().flatMap(Option())
,但反过来不行?如果它使用GenTraversableOne,它将处理所有收集,包括Options@Joan我在回答中添加了对您评论的回应非常好的回答谢谢@Dima。我现在了解了问题的各个方面。