如何解除Either中的部分功能

时间:2014-10-26 18:44:02

标签: scala

我想解除Either中的部分功能。

有没有更好的方法:

def lift[A, B, C](pf : PartialFunction[A, B])(c: A => C) : A =>  Either[C, B] = { a => if (pf.isDefinedAt(a)) Right(pf(a)) else Left(c(a)) }

1 个答案:

答案 0 :(得分:5)

还有很多其他的写法可以让你避免令人不快的isDefinedAt

def lift[A, B, C](pf: PartialFunction[A, B])(c: A => C): A => Either[C, B] =
  (pf andThen Right.apply) orElse (PartialFunction(c andThen Left.apply))

或者:

def lift[A, B, C](pf: PartialFunction[A, B])(c: A => C): A => Either[C, B] =
  (a: A) => pf.lift(a).fold[Either[C, B]](Left(c(a)))(Right(_))

例如。

Scalaz使用toRight

使上一次实现更加出色
import scalaz._, Scalaz._

def lift[A, B, C](pf: PartialFunction[A, B])(c: A => C): A => Either[C, B] =
  (a: A) => pf.lift(a).toRight(c(a))

我可能会使用某些版本的orElse实现。