我正在学习Scala中的函数式编程(第一版),在完成第4章:无异常处理错误的第一个练习的解决方案时遇到了一个错误。
本章使用以下结构重新构建Option类型:
sealed trait Option[+A]
case class Some[+A](get: A) extends Option[A]
case object None extends Option[Nothing]
trait Option[+A] {
def map[B](f: A => B): Option[B]
def flatMap[B](f: A => Option[B]): Option[B]
def getOrElse[B >: A](default: => B): B
def orElse[B >: A](ob: => Option[B]): Option[B]
def filter(f: A => Boolean): Option[A]
}
当通过scala REPL加载由书的答案键验证的解决方案时
sealed trait Option[+A] {
def map[B](f: A => B): Option[B] = this match {
case Some(a) => Some(f(a))
case None => None
}
}
case class Some[+A](get: A) extends Option[A]
case object None extends Option[Nothing]
我收到一个编译错误:
scala> :load ErrorHandling.scala
val args: Array[String] = Array()
Loading ErrorHandling.scala...
case Some(a) => Some(f(a))
^
ErrorHandling.scala:3: error: constructor cannot be instantiated to expected type;
found : Some[A(in class Some)]
required: Option[A(in trait Option)]
case Some(a) => Some(f(a))
^
ErrorHandling.scala:3: error: type mismatch;
found : Some[B]
required: Option[B]
case None => None
^
ErrorHandling.scala:4: error: pattern type is incompatible with expected type;
found : None.type
required: Option[A]
case None => None
^
ErrorHandling.scala:4: error: type mismatch;
found : None.type
required: Option[B]
给定None和Some扩展选项,我不确定类型不匹配是在哪里产生的。
任何帮助都将非常感激!
:load
逐个解释文件中的行,就好像它们是键入的一样。这严重破坏了您的情况,因为您在REPL中键入的行就好像它们都在不同的文件中一样;特别是,前面的行不能看到后面的行。因此,Option
定义中的Some
和None
被解析为标准定义,而不是后来定义的定义,sealed
使这些定义不合法,因为它们不在同一个"文件"中。
使用:paste
scala> :paste ErrorHandling.scala
Pasting file ErrorHandling.scala...
trait Option
class Some
object None
scala>