Scala中的函数式编程-构建选项类型



我正在学习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定义中的SomeNone被解析为标准定义,而不是后来定义的定义,sealed使这些定义不合法,因为它们不在同一个"文件"中。

使用:paste

scala> :paste ErrorHandling.scala
Pasting file ErrorHandling.scala...
trait Option
class Some
object None
scala> 

相关内容

  • 没有找到相关文章

最新更新