【发布时间】:2020-03-10 14:49:30
【问题描述】:
当我尝试使用 Option 变量时。我发现有 4 折方法。
fold[B](ifEmpty:=>B)(f:Int=>B)fold[A1 >: Int](z : A1)(op : (A1 , A1) => A1)foldLeft[B](z : B)(op : (B , Int) => B)foldRight[B](z : B)(op : (Int , B) => B)
第一个方法fold[B](ifEmpty:=>B)(f:Int=>B)来自Option类。
其他 3 种方法来自 TraversableOnce 特征。
所以我的问题是:
1> 为什么变量可以使用 TraversableOnce 特征中的 foldLeft/foldRight 方法,而 Option 类不扩展 TraversableOnce ?
2> 为什么我不能使用折叠方法,而是使用 TraversableOnce 特征的 foldLeft/foldRight 方法?因为当我使用fold[A1 >: Int](z : A1)(op : (A1 , A1) => A1) 时。 IDE 没有编译成功。
val x = Some(5)
x.fold(0)( (a) => a)
x.fold(0)( (a,b) => a + b) //compile failed
val y = List(5)
y.fold(0)( (a,b) => a + b)
【问题讨论】:
-
哪个版本的scala?
-
您可以在
Option上使用fold和选项扩展IterableOnce。请参阅scala-lang.org/api/current/scala/… 的文档大多数 IDE 无法正确处理 Scala 的类型推断。确保你通过sbt编译看看是否有问题 -
@1565986223 : scala-2.11.12
-
这就是 Scala 版本之间的区别。在 2.13 中,
Option确实继承自 IterableOnce,而在 2.11 中则没有。 scala-lang.org/api/2.11.12/#scala.Option -
fold(编译失败)在Shadowed Implicit Value Members(被编译的那个遮蔽)scala-lang.org/api/2.11.12/… 所以是的,你不能使用它
标签: scala