我刚开始用Scala学习FP,所以为这个问题道歉。我发现了用于模式匹配的练习(练习3.1 structures),但是我有点困惑,很难理解为什么X的结果是3。
val x = List(1, 2, 3, 4, 5) match {
case Cons(x, Cons(2, Cons(4, _))) => x
case Nil => 42
case Cons(x, Cons(y, Cons(3, Cons(4, _)))) => x + y
case Cons(h, t) => h + sum(t)
case _ => 101
}有些人能在这里协助逐步调试这个场景吗?我相信这会帮助我理解这个概念。
谢谢。
发布于 2016-09-29 14:18:08
Scala中不变的List是一个Cons-list。这意味着它由一系列Cons-objects组成,并以Nil结尾。例如,您的列表:
List(1, 2, 3, 4, 5)就是这个Cons-list:
Cons(1, Cons(2, Cons(3, Cons(4, Cons(5, Nil)))))当您在Scala中的列表上进行模式匹配时,您可以使用这个Cons-structure。这就是这个例子的作用。
让我看看每一种模式,告诉你它们是做什么的:
_意味着忽略列表的其余部分(因此它可能是3个或更多元素)。
案例Cons(x,Cons(2,Cons(4,_) => x希望现在可以看到,x的值变为3,因为它与第三种情况相匹配。这将返回1+ 2,等于3。
发布于 2016-09-29 14:12:25
List(1, 2, 3, 4, 5)匹配模式`Cons(x,Cons(y,Cons(3,Cons(4,)`_
这里x对应于1,y对应于2、3和4已就位,而忽略了最后一个。
所以x + y = 1 + 2
解释
列表不匹配第一个模式(Cons(x, Cons(2, Cons(4, _)))),因为在2个模式之后有4个
列表不匹配第二种模式,即Nil,因为list不是Nil
列表匹配第三种模式
当一个图案匹配时..。其他病例则不匹配。因此,模式匹配在第三例(成功匹配)之后停止匹配。
发布于 2016-09-29 14:17:45
列表(1,2,3,4,5)等于Cons(1,Cons(2,Cons(3,Cons(4,Cons(5,Nil)。
val x = List(1, 2, 3, 4, 5) match {
case Cons(x, Cons(2, Cons(4, _))) => x //1
case Nil => 42 //2
case Cons(x, Cons(y, Cons(3, Cons(4, _)))) => x + y //3
case Cons(h, t) => h + sum(t) //4
case _ => 101 //5
}"_“字的意思是‘不关心’
重要的是要理解,提供模式的第一次匹配将影响结果。
https://stackoverflow.com/questions/39772435
复制相似问题