首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模式匹配

模式匹配
EN

Stack Overflow用户
提问于 2013-09-12 01:43:26
回答 2查看 3.6K关注 0票数 3

Scala中的函数编程,我正在尝试实现Either.map

代码语言:javascript
复制
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.的概念

代码语言:javascript
复制
    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))

请建议我如何实施它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-12 04:57:06

错误消息指出,不能将Either用作case类构造函数。IOW,Either等同于抽象类,因为您已经用自己的可实现方法将它编码为一个特性。让我们假设您有以下EitherLeftRight的编码表示

代码语言:javascript
复制
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函数编写为:

代码语言:javascript
复制
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,我按原样返回它。Either

票数 5
EN

Stack Overflow用户

发布于 2013-09-12 01:47:36

试试这个

代码语言:javascript
复制
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
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18754013

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档