首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FP模式匹配

FP模式匹配
EN

Stack Overflow用户
提问于 2016-09-29 14:00:01
回答 5查看 509关注 0票数 0

我刚开始用Scala学习FP,所以为这个问题道歉。我发现了用于模式匹配的练习(练习3.1 structures),但是我有点困惑,很难理解为什么X的结果是3。

代码语言:javascript
复制
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
}

有些人能在这里协助逐步调试这个场景吗?我相信这会帮助我理解这个概念。

谢谢。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-09-29 14:18:08

Scala中不变的List是一个Cons-list。这意味着它由一系列Cons-objects组成,并以Nil结尾。例如,您的列表:

代码语言:javascript
复制
List(1, 2, 3, 4, 5)

就是这个Cons-list:

代码语言:javascript
复制
Cons(1, Cons(2, Cons(3, Cons(4, Cons(5, Nil)))))

当您在Scala中的列表上进行模式匹配时,您可以使用这个Cons-structure。这就是这个例子的作用。

让我看看每一种模式,告诉你它们是做什么的:

  1. 如果第二个元素为2,第三个元素为4,则该表达式将返回列表的第一个元素。_意味着忽略列表的其余部分(因此它可能是3个或更多元素)。 案例Cons(x,Cons(2,Cons(4,_) => x
  2. 这个匹配空列表。如果匹配,则表达式返回42。 案件Nil => 42
  3. 如果第三个元素为3,第四个元素为4,则此元素匹配。如果匹配,表达式将返回列表中两个前元素的和。 (x,Cons(y,Cons(3,Cons(4,_) => x+y
  4. 这个元素与至少一个元素匹配所有的列表。如果匹配,表达式将返回第一个元素加上列表其余部分的和(基本上等于整个列表的和)。 案例Cons(h,t) => h+ sum(t)
  5. 这个和其他的都匹配。这是默认情况,并返回101。这是不应该发生的,因为所有其他情况都在上面。 案例=> 101

希望现在可以看到,x的值变为3,因为它与第三种情况相匹配。这将返回1+ 2,等于3。

票数 3
EN

Stack Overflow用户

发布于 2016-09-29 14:12:25

List(1, 2, 3, 4, 5)匹配模式`Cons(x,Cons(y,Cons(3,Cons(4,)`_

这里x对应于1y对应于2、3和4已就位,而忽略了最后一个。

所以x + y = 1 + 2

解释

列表不匹配第一个模式(Cons(x, Cons(2, Cons(4, _)))),因为在2个模式之后有4个

列表不匹配第二种模式,即Nil,因为list不是Nil

列表匹配第三种模式

当一个图案匹配时..。其他病例则不匹配。因此,模式匹配在第三例(成功匹配)之后停止匹配。

票数 1
EN

Stack Overflow用户

发布于 2016-09-29 14:17:45

列表(1,2,3,4,5)等于Cons(1,Cons(2,Cons(3,Cons(4,Cons(5,Nil)。

代码语言:javascript
复制
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
}

"_“字的意思是‘不关心’

重要的是要理解,提供模式的第一次匹配将影响结果。

  1. 不能,因为它的Cons(2,Cons(3,Cons(4,.)
  2. 不可能,因为它不是零,它是Cons
  3. 这提供了模式,因为x可以等于1,y等于2,其余的按原样继续。当他看到"_“字时,他不关心他看到了什么,这意味着它提供了什么
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39772435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档