两种模式匹配

时间:2013-09-12 01:43:27

标签: scala either

Functional Programming in Scala开始,我正在尝试实施Either.map

trait Either[+E, +A] {
    def map[B](f: A => B): Either[E, B] =  this match {
        case Either(x: E, y: A) => Right(f(y))
        case _ => Left()
    }
}

编译时会出现一个错误。我没有展示它们,因为我似乎错过了实施Either.

的概念
    Either.scala:3: error: value Either is not a case class constructor, 
nor does it have an unapply/unapplySeq method
                    case Either(x: E, y: A) => Right(f(y))

请告知我实施它。

2 个答案:

答案 0 :(得分:5)

错误消息表明您不能将Either用作案例类构造函数。 IOW,Either等同于抽象类,因为您已将其编码为具有自己的可实现方法的特征。假设您有EitherLeftRight的以下编码表示:

sealed trait Either[+E, +A] {
    def map[B](f: A => B): Either[E, B] =  ???
}

// Left signifies error condition
// Right is something Right, along with its message.
case class Left[+E](err: E) extends Either[E,Nothing]
case class Right[+E](msg: E) extends Either[Nothing,E]

您可以将map函数编写为:

def map[B](f: A => B): Either[E, B] = this match {
    case Right(v) => Right(f(v))
    case Left(e) => Left(e)
}

这里我简单地说,如果你遇到一些应该是正确值的东西,就可以对它进行一些函数计算并完全按原样返回 - Right。由于Eithersealed trait(主要是为了方便),唯一的其他类型可能是Left我按原样返回。 Read more about Either

答案 1 :(得分:3)

尝试这个

trait Either[+E, +A] {
    def map[B](f: A => B): Either[E, B] =  this match {
        case Right(y) => Right(f(y))
        case left: Left[E] => left
    }
}