我正在阅读一些Scala问题,我看到了这一点:
def last[A](l: List[A]): A = l match {
case h :: Nil => h
case _ :: tail => last(tail)
case _ => throw new NoSuchElementException
}
我理解cons运算符的基础知识。但是h
来自哪里?
在顶部case h
,我可以看到我们如何在列表末尾有Nil
的情况下说,返回h
,这将是列表的最后一个元素。但h
甚至定义在哪里?
答案 0 :(得分:2)
h
语句中定义了case
。
Scala的模式匹配具有非常简洁的语法,可以让人习惯。它混合了一些非常相似的东西:
case 1 :: tail => ...
仅匹配以1
开头的列表。_
,则匹配任何内容。示例:case _ :: tail => ...
case h :: tail => ...
与前一个示例的输入完全相同,但也会在“h
”部分中将第一个元素分配给...
。答案 1 :(得分:1)
h
是一个标识符,表示A
类型的单个元素,并在case
子句本身中定义:字母“h”在此上下文中是明智的,因为它明确表示“头。”但是,您可以使用任何合法的Scala标识符:
def last[A](l: List[A]): A = l match {
case baconWrappedShrimp :: Nil => baconWrappedShrimp
case _ :: tail => last(tail)
case _ => throw new NoSuchElementException
}
答案 2 :(得分:0)
Scala模式匹配允许您在案例中编写临时变量。 第一种情况涵盖了l是以下列表{h,Nil}的情况。请注意'::'运算符用于将单个元素与列表连接起来。与连接两个列表的':::'运算符不同。