关于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
答案 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]
}