scala - 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,我不确定类型不匹配是在哪里出现的。
任何帮助将不胜感激!
解决方案
:load
逐一解释文件中的行,就好像它们是键入的一样。这严重破坏了您的情况,因为您在 REPL 中键入的行就像它们都在不同的文件中一样;特别是,前面的行看不到后面的行。所以定义中的Some
and被解析为标准的,而不是后面定义的,并且使这些定义非法,因为它们不在同一个“文件”中。None
Option
sealed
利用:paste
scala> :paste ErrorHandling.scala
Pasting file ErrorHandling.scala...
trait Option
class Some
object None
scala>
推荐阅读
- azure - Microsoft MIP JAVA SDK 示例错误:“无法识别的异常:profile_add_engine_async”
- angular - 在 Chromium 上使用 Angular 刷新嵌入式 PDF
- sql - 如何将表A中的行插入表B中不在表B中的行
- android - 是否可以在单个应用程序中与不同的服务器数据库同步
- webpack - 是否可以从 json 文件中导入单个字段?
- javascript - JS 动态 json 数组创建在 IE 11 中不起作用
- swift - 斯威夫特我怎样才能部分改变UILabel的颜色
- asp.net-core - 如何从 JWT 令牌跟踪客户端 ID/应用程序 ID
- r - 资源高效的连接和过滤方法
- apache-kafka - Kafka JDBC 接收器连接器不会实时创建新的 postgreSQL 表