首页 > 解决方案 > Option 类中的 foldLeft/foldRight 和 fold 来自哪里?

问题描述

当我尝试使用 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

解决方案


  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)

推荐阅读