scala - Scala:返回列表头但空列表不能返回 Nil
问题描述
我刚刚开始学习 Scala,但我在使用 head 函数时遇到了一些麻烦。我想从 A 元素列表中返回第一个元素。但在 Nil 的情况下,我不知道返回什么。该函数需要 A,但由于 A 是抽象的并且可以是任何东西,我不知道要返回什么。
当我将一个空列表传递给我的 tails 函数时,返回 Nil 工作正常。
sealed trait List[+A]
case object Nil extends List[Nothing]
case class Cons[+A](head: A, tail: List[A]) extends List[A]
object List {
def sum(ints: List[Int]): Int = ints match {
case Nil => 0
case Cons(x,xs) => x + sum(xs)
}
def tail[A](xs: List[A]): List[A] = {
xs match {
case Cons(_, ys) => ys
case Nil => Nil
}
}
def head[A](as: List[A]): A = {
as match {
case Cons(b, _) => b
case Nil => Nil
}
}
}
object e31 {
def main(args: Array[String]): Unit = {
val ex3: List[Int] = Cons(1, Cons(2, Nil))
val ex2: List[Int] = Nil;
println(List.sum(ex3)) //3
println(List.tail(ex2)) //Nil
println(List.tail(ex3)) //cons(2, Nil)
//println(List.head(ex3)) //doesn't work
}
}
非常感谢任何有助于理解问题的帮助。
解决方案
救援选择
def head[A](as: List[A]): Option[A] = as match {
case Cons(b, _) => Some(b)
case Nil => None
}
做head
回报Option
。使用Option
您可以传达有时答案不可用或无效的信息。例如:在这种情况下,当列表为空时,head
操作没有任何意义。所以,我们None
在这种情况下返回值。否则当列表不为空时,我们返回Some
有效结果。
为了传达结果并不总是可用,我们将Option
其用作返回类型
编译错误
下面的代码会导致编译错误,因为您的返回类型是A
但您实际上返回的是Nil
哪种类型List[A]
def head[A](as: List[A]): A = as match {
case Cons(b, _) => b
case Nil => Nil // expected A found: List[A]
}
请注意,这个函数(返回选项的头(上面声明的))
headOption
在标准库中被调用
推荐阅读
- java - 从 java 调用 clojure 时无法在类路径上找到 proj/core.clj
- javascript - 如何找到具有样式属性的不透明度为 1 的表格行的长度?
- postgresql - 尽管使用了 alter user set search_path .... 命令,但 Postgresql set search_path 不会影响
- api - 如何知道 twitch 流媒体是否直播并发送相关消息?不和谐.py
- python - 实现了方差方程,但它们没有相同的结果
- arrays - 按指定键的键和最后一个值过滤字典对象数组
- python - 运行 pip list 时出错(modulenotfounderror no module named 'pip._internal.utils')
- gradle - 等待独占访问文件的超时达到 120000
- reactjs - 在 github 上上传 react 应用程序的问题。我在为此运行 npm 代码时在终端中上传错误代码
- javascript - Javascript Array.map() 是否返回不同的实例对象?