Scala:返回列表头,但空列表可以';t返回零

Scala:返回列表头,但空列表可以';t返回零,scala,list,functional-programming,traits,Scala,List,Functional Programming,Traits,我刚开始学习Scala,我的头部功能有点问题。我想从元素列表中返回第一个元素。但是在零的情况下,我不知道该返回什么。函数需要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

我刚开始学习Scala,我的头部功能有点问题。我想从元素列表中返回第一个元素。但是在零的情况下,我不知道该返回什么。函数需要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

    }
}
非常感谢您对理解问题的任何帮助。

请选择救援方案 使
头部
返回
选项
。使用
选项
可以告知您,有时答案不可用或无效。例如:在这种情况下,当列表为空时
head
操作没有意义。因此,在这种情况下,我们返回
None
值。否则,当列表非空时,我们将返回有效结果

为了说明结果并不总是可用,我们使用
选项
作为返回类型

编译错误 下面的代码导致编译错误,因为您的返回类型是
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]
}
注意,这个函数(返回选项(上面声明的)的head)在std lib中被称为
headOption

救援方案 使
头部
返回
选项
。使用
选项
可以告知您,有时答案不可用或无效。例如:在这种情况下,当列表为空时
head
操作没有意义。因此,在这种情况下,我们返回
None
值。否则,当列表非空时,我们将返回有效结果

为了说明结果并不总是可用,我们使用
选项
作为返回类型

编译错误 下面的代码导致编译错误,因为您的返回类型是
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]
}
注意,这个函数(返回选项(上面声明的)的head)在std lib中被称为
headOption


有一种奇怪的类型叫做
Nothing
<代码>无是一切的子类型。特别是,
Nothing
A
的子类型(无论
A
是什么)。您不能生成类型为
Nothing
(此类型为无人居住)的任何值。但是
throw
关键字的行为就像它将“返回”
什么都不返回一样。如果该操作是无意义的,则只能抛出带有描述性错误消息的异常:

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

有一种奇怪的类型叫做
Nothing
<代码>无
是一切的子类型。特别是,
Nothing
A
的子类型(无论
A
是什么)。您不能生成类型为
Nothing
(此类型为无人居住)的任何值。但是
throw
关键字的行为就像它将“返回”
什么都不返回一样。如果该操作是无意义的,则只能抛出带有描述性错误消息的异常:

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

不,返回
选项的东西通常被称为…@AndreyTyukin,我知道
head
是OP编写的函数。(这是一个自定义函数)。我只是要求OP更改退货类型。OP可以将函数名更改为
headOption
Nah,返回
Option
的东西通常被称为…@AndreyTyukin,我知道
head
是OP编写的函数。(这是一个自定义函数)。我只是要求OP更改退货类型。OP可以将函数名称更改为
headOption