首页 > 解决方案 > Scala 中的函数式编程 - 构建选项类型

问题描述

我正在学习 Scala 中的函数式编程(第一版),在解决第 4 章第一个练习的解决方案时遇到了一个错误:无异常处理错误。

本章使用以下结构重建 Option 类型:

sealed trait Option[+A]
case class Some[+A](get: A) extends Option[A] 
case object None extends Option[Nothing]

第一个练习指导读者在 Option 类型上实现以下方法:

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 extend Option,我不确定类型不匹配是在哪里出现的。

任何帮助将不胜感激!

标签: scalafunctional-programming

解决方案


:load逐一解释文件中的行,就好像它们是键入的一样。这严重破坏了您的情况,因为您在 REPL 中键入的行就像它们都在不同的文件中一样;特别是,前面的行看不到后面的行。所以定义中的Someand被解析为标准的,而不是后面定义的,并且使这些定义非法,因为它们不在同一个“文件”中。NoneOptionsealed

利用:paste

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

scala> 

推荐阅读