【发布时间】:2015-03-17 17:29:59
【问题描述】:
这是我对 Scala 中 99 个问题的第三个问题 (P03) 的尝试 (http://aperiodic.net/phil/scala/s-99/):
import scala.annotation._
// Find the nth element of a list.
// nth(2, List(1, 1, 2, 3, 5, 8)) = 2
object P03 {
@tailrec def nth[A](n: Int, ls: List[A]): A = (n, ls) match {
case (0, h :: t :: Nil) => h
case (n, _ :: t) => nth(n - 1, t)
case _ => println(n); throw new IllegalArgumentException
}
谜团在于这段代码打印-4并抛出IllegalArgumentException
解决办法当然是把第一个模式改成:
case (0, h :: _) => h
现在打印正确答案2
问题是为什么?两者之间的细微差别是什么:
case (0, h :: t :: Nil) => h
&
case (0, h :: _) => h
谢谢!
【问题讨论】:
-
区别在于
h :: t :: Nil只匹配一个有两个元素的列表(h和t,Nil是一个列表结束的标记)而h :: _匹配每一个非空列表,即至少有一个元素的列表。 -
您能否将其添加为答案而不是评论。我想将其标记为答案并关闭它:)。谢谢。