通过'作为模式'

时间:2015-05-21 22:18:54

标签: haskell design-patterns overlapping-matches as-pattern

我是函数式编程的新手,特别是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必须匹配(_:_)并且只使用[]完成第一个任何模式。

我的假设是否正确?

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

2 个答案:

答案 0 :(得分:3)

在两种情况下,您的递归都会last,而不是last1 / last2

  与last1相比,

last2应该不重叠。   让我们看看特定的字符串f:[]。它与[x]中的(x:xs)last1匹配。

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

  

last2中,它会与[y]匹配。但不是(y:ys@(_:_)),因为ys必须匹配(_:_)并且只使用[]完成第一个任何模式。

你的短语有点奇怪,但你认为f:[](y:ys@(_:_))不匹配是正确的,因为后者基本上匹配_:_:_不匹配。

  

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

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

答案 1 :(得分:0)

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