在SCALA中查找常规类型的第N个元素会引发NoSuchElementException

时间:2017-07-18 19:10:14

标签: scala exception

在以下代码中:

object example {

  trait List[T] {
    def isEmpty: Boolean

    def head: T

    def tail: List[T]
  }

  class Cons[T](val head: T, val tail: List[T]) extends List[T] {
    def isEmpty: Boolean = false
  }

  class Nil[T] extends List[T] {
    def isEmpty: Boolean = true

    val head: Nothing = throw new NoSuchElementException("Nil.head")
    val tail: Nothing = throw new NoSuchElementException("Nil.tail")

  }


  def nth[T](n: Int, xs: List[T]): T =
    if (xs.isEmpty) throw new IndexOutOfBoundsException("Out of Bound")
    else if (n == 0) xs.head
    else nth(n - 1, xs.tail)

  val list = new Cons(1, new Cons(2, new Cons(3, new Nil)))
  nth(2,list) //should return 3

}

我试图定义一般特征List[T],以后我可以给它任何类型。我可以从它实现我的类,然后我定义了一个函数,它接受一个整数和一个列表,并返回位于第n个给定索引的元素。 val list = new Cons(1, new Cons(2, new Cons(3, new Nil)))抛出NoSuchElementException。我认为我的代码有一个根本问题,我可以搞清楚。 顺便说一句,我正在运行REPL.Thank你。<​​/ p>

2 个答案:

答案 0 :(得分:1)

请更正

中的以下内容
val head: Nothing = throw new NoSuchElementException("Nil.head")
val tail: Nothing = throw new NoSuchElementException("Nil.tail")

def head: Nothing = throw new NoSuchElementException("Nil.head")
def tail: Nothing = throw new NoSuchElementException("Nil.tail")

答案 1 :(得分:1)

Nil中,您将headtail定义为val,因此这些语句会在您实例化Nil时执行,从而导致错误。

将其更改为def head: Nothing = ...def tail: Nothing = ...