Я не уверен, какую версию Scala вы использовали в то время. В настоящее время в Scala 2.12.6 нет проблем с компиляцией вашего кода, например:
def foo(ox: Option[Int]): Either[String, Int] =
ox.toRight("No number")
Еще один момент, который я хотел бы отметить, заключается в том, что свертывание (хотя это мой предпочтительный метод свертывания всего, что имеет метод fold) довольно часто требует помощи с параметрами типа. Есть два способа, которыми компилятор может проверить тип выражения: либо он может вывести параметры типа, либо просто найти их явно определенными.
В вашем примере, если вы пытаетесь свернуть такой вариант:
def foo(ox: Option[Int]): Either[String, Int] =
ox.fold(Left("No number") : Either[String, Int])(x => Right(x))
Вы явно предоставляете информацию о типе для первого аргумента, который, в свою очередь, можно использовать для вывода параметра типа fold
. Вы помогаете механизму вывода типов.
С другой стороны, вы можете просто явно указать параметр типа для fold
следующим образом:
def foo(ox: Option[Int]): Either[String, Int] =
ox.fold[Either[String, Int]](Left("No number"))(x => Right(x))
Теперь ваши фактические аргументы (на уровне значения) не замусорены лишней информацией о типе, и когда компилятор смотрит на них, не происходит вывода типа, он может сразу сказать, что такое параметр типа fold
, поскольку он был явно предоставлен. Используйте квадратные скобки, чтобы явно указать параметр типа.
Еще один момент, касающийся x => Right(x)
, здесь вы практически создаете новый функциональный литерал, который ничего не делает, кроме передачи x в метод apply
объекта-компаньона класса Right case. У вас уже есть функция соответствующей формы. Он принимает x
и возвращает Right(x)
. Это метод apply
. Вы можете обратиться к нему (передать его) напрямую.
def foo(ox: Option[Int]): Either[String, Int] =
ox.fold[Either[String, Int]](Left("No number"))(Right.apply)
person
Peter Perháč
schedule
20.07.2018