我是函数式编程,尤其是haskell的新手,我有两个问题,一个是模式,另一个是通过使用它减少重叠。给出以下代码示例:
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:[]吧。
发布于 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:[]吧。
ys与o:o:[] (或"oo"或[o,o])相等。
发布于 2015-05-21 22:35:40
这两个函数在Haskell中是相同的,因为使用了第一个匹配方程。您的第二个函数更明确一些,但是第一个函数更具有惯用性。
https://stackoverflow.com/questions/30385303
复制相似问题