首页 > 解决方案 > 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

    }
}

非常感谢任何有助于理解问题的帮助。

标签: scalalistfunctional-programmingtraits

解决方案


救援选择

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在标准库中被调用


推荐阅读