首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >as模式的功能,通过“as模式”不重叠模式

as模式的功能,通过“as模式”不重叠模式
EN

Stack Overflow用户
提问于 2015-05-21 22:18:54
回答 2查看 117关注 0票数 2

我是函数式编程,尤其是haskell的新手,我有两个问题,一个是模式,另一个是通过使用它减少重叠。给出以下代码示例:

代码语言:javascript
复制
last1 :: [a]          ->  a
last1    [x]          =   x
last1    (x:xs)       =   last xs

last2 :: [a]          ->  a
last2    [y]          =   y
last2    (y:ys@(_:_)) =   last ys

last1相比,last2应该是不重叠的。让我们来看看特定的字符串f:[]。它将与[x](x:xs)last1上匹配。

last2中,它将与[y]匹配。但对(y:ys@(_:_))来说不是这样,因为ys必须与(_:_)匹配,只需使用[]来实现第一个any模式。

我的假设正确吗?

现在看一看特定的字符串f:o:o:[]。现在,模式(y:ys@(_:_))匹配。在这种情况下,我很好奇绑定是如何工作的。第一次通话后的ys是什么?我想是o:o:[]吧。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-21 22:34:47

在这两种情况下,您的递归都将转到last,而不是last1/last2

last1相比,last2应该是不重叠的。让我们来看看特定的字符串f:[]。它将与[x](x:xs)last1上匹配。

它可以与(x:xs)匹配,但不会匹配,因为模式匹配只会与第一个成功匹配。在这方面,重叠并非模棱两可(总是采用第一个定义)。

last2中,它将与[y]匹配。但对(y:ys@(_:_))来说不是这样,因为ys必须与(_:_)匹配,只需使用[]来实现第一个any模式。

您的措辞有点奇怪,但f:[]不能与(y:ys@(_:_))匹配,因为后者基本上是在_:_:_上匹配的,这并不匹配。

现在看一看特定的字符串f:o:o:[]。现在,模式(y:ys@(_:_))匹配。在这种情况下,我很好奇绑定是如何工作的。第一次通话后的ys是什么?我想是o:o:[]吧。

yso:o:[] (或"oo"[o,o])相等。

票数 3
EN

Stack Overflow用户

发布于 2015-05-21 22:35:40

这两个函数在Haskell中是相同的,因为使用了第一个匹配方程。您的第二个函数更明确一些,但是第一个函数更具有惯用性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30385303

复制
相关文章

相似问题

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