在Option上实现map

时间:2013-08-29 02:49:05

标签: scala

关于FP in Scala示例的更多工作,我尝试按如下方式实现Option特征的map函数:

sealed trait MyOption[+A] {
    def map[B](f: A => B): Option[B] = this match {
        case Some(a) => Some(f(a))
        case _ => None
    }
}

但是,如果我理解正确的话,编译时错误会显示我在Some(A)的情况下没有正确匹配模式。使用模式匹配,如何编写第一个案例以使某些(A)值匹配?

>scalac MyOption.scala
MyOption.scala:3: error: constructor cannot be instantiated to expected type;
 found   : Some[A(in class Some)]
 required: MyOption[A(in trait MyOption)]
                case Some(a) => Some(f(a))
                     ^
MyOption.scala:3: error: not found: value a
                case Some(a) => Some(f(a))
                                       ^
two errors found

1 个答案:

答案 0 :(得分:5)

您正在尝试使用Some和None来定义map,这些是Scala提供的Option trait的子类,而不是根据您自己的trait的子类。尝试类似:

sealed trait MyOption[+A] {
    import MyOption._
    def map[B](f: A => B): MyOption[B] = this match {
        case MySome(a) => MySome(f(a))
        case _ => MyNone
    }
}

object MyOption {
  case class MySome[+A](a: A) extends MyOption[A]
  case object MyNone extends MyOption[Nothing]
}