2

我是函数式编程的新手,尤其是 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。让我们看一下具体的 String f:[]。它将与[x](x:xs)in匹配last1

last2它会匹配到[y]. 但不是(y:ys@(_:_)),因为ys必须匹配(_:_)并且只满足第一个 any 模式[]

我的假设正确吗?

现在来看看具体的 String f:o:o:[]。现在模式(y:ys@(_:_))匹配。在这种情况下,我很好奇绑定是如何工作的。ys第一次通话后是什么?我认为是o:o:[]

4

2 回答 2

3

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

last1与 相比应该是不重叠的last2。让我们看一下具体的 String f:[]。它将与[x](x:xs)in匹配last1

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

last2它会匹配到[y]. 但不是(y:ys@(_:_)),因为ys必须匹配(_:_)并且只满足第一个 any 模式[]

您的措辞有点奇怪,但您是正确的,f:[]无法匹配,(y:ys@(_:_))因为后者基本上匹配_:_:_不匹配。

现在来看看具体的 String f:o:o:[]。现在模式(y:ys@(_:_))匹配。在这种情况下,我很好奇绑定是如何工作的。ys第一次通话后是什么?我认为是o:o:[]

ys等于o:o:[](或"oo"[o,o])。

于 2015-05-21T22:34:47.633 回答
0

这两个函数在 Haskell 中是相同的,因为使用了第一个匹配方程。您的第二个功能对此更加明确,但第一个功能更加惯用。

于 2015-05-21T22:35:40.013 回答