Откуда идут foldLeft / foldRight и fold в классе Option? - PullRequest
1 голос
/ 10 марта 2020

Когда я пытаюсь использовать переменную 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> Почему переменная может использовать метод foldLeft / foldRight из черты TraversableOnce, в то время как класс Option не расширяет TraversableOnce?
2> Почему я не могу использовать сложение метод, но метод foldLeft / foldRight из черты TraversableOnce? Поскольку я использую 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)

1 Ответ

1 голос
/ 10 марта 2020
  1. Option имеет неявное преобразование в Iterable[T] Опция $

  2. метод fold определяется Option сама по себе, и она доступна из-за неявного преобразования в Iterable[T], но поскольку метод непосредственно определен в самом классе, неявное преобразование не предпринимается. Вы можете заставить его:

val o: Option[Int] = Some(5)
(o: Iterable[Int]).fold(0)((a, b) => a + b)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...