从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))
请告知我实施它。
答案 0 :(得分: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)
}
这里我简单地说,如果你遇到一些应该是正确值的东西,就可以对它进行一些函数计算并完全按原样返回 - Right
。由于Either
是sealed 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
}
}