Scala:返回列表的头,但空列表不能返回Nil

时间:2018-08-29 19:36:29

标签: scala list functional-programming traits

我才刚刚开始学习Scala,并且头部功能有些麻烦。我想从A元素列表中返回第一个元素。但是对于Nil,我不知道该返回什么。该函数期望A,但是由于A是抽象的并且可以是任何东西,所以我不知道返回什么。

当我将一个空列表传递给我的尾巴函数时,返回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

    }
}

我们非常感谢您对问题的理解。

2 个答案:

答案 0 :(得分:2)

救援方案

def head[A](as: List[A]): Option[A] = as match {
 case Cons(b, _) => Some(b)
 case Nil        => None
}

head返回Option。使用Option可以传达有时答案不可用或无效的答案。例如:在这种情况下,列表为空head操作没有意义。因此,在这种情况下,我们返回None值。否则,当list不为空时,我们将返回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]
}
  

请注意,此函数(返回选项的头(在声明之前))在std lib中称为headOption

答案 1 :(得分:2)

有一个叫做Nothing的奇怪类型。 Nothing是所有内容的子类型。特别地,NothingA的子类型(无论A是什么)。您不能产生任何类型为Nothing的值(此类型为无人居住)。但是throw关键字的行为就像一样,它会“返回” Nothing 。如果操作无意义,那么您可以执行的操作是抛出带有描述性错误消息的异常:

case Cons(h, _) => h
case Nil => throw new NoSuchElementException("`head` called on `Nil`")