3

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))

请告诉我实施它。

4

2 回答 2

5

错误消息说您不能Either用作案例类构造函数。IOW,Either相当于一个抽象类,因为您已将其编码为具有自己可实现方法的特征。假设您有Either,Left和的以下编码表示Right

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)
}

在这里,我只是说,如果您遇到应该是正确值的东西,请对其执行一些函数计算并完全按原样返回 - a Right。由于Eitheris a sealed trait(主要是为了方便),唯一的其他类型可能是Left我按原样返回的 a 。阅读更多关于Either

于 2013-09-12T04:57:06.527 回答
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
    }
}
于 2013-09-12T01:47:36.120 回答