【问题标题】:Where foldLeft/foldRight and fold in Option class come from?Option 类中的 foldLeft/foldRight 和 fold 来自哪里?
【发布时间】: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


【解决方案1】:
  1. Option 隐式转换为 Iterable[T] Option$

  2. fold 方法是由Option 本身定义的,由于隐式转换为Iterable[T] 而可用,但由于该方法是直接在类本身上定义的,因此不会尝试隐式转换。你可以强制它:

val o: Option[Int] = Some(5)
(o: Iterable[Int]).fold(0)((a, b) => a + b)

【讨论】:

    猜你喜欢
    • 2011-09-09
    • 1970-01-01
    • 2013-06-12
    • 2017-03-25
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多