as-pattern 的功能,非重叠模式通过 'as pattern'

Functionality of as-pattern, non overlapping pattern through '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
last2 相比,

last1 应该不重叠。 我们来看看具体的Stringf:[]。它将匹配 last1 中的 [x](x:xs)

last2 中它将匹配 [y]。但不是 (y:ys@(_:_)),因为 ys 必须匹配 (_:_) 并且只用 [].

满足第一个任意模式

我的假设是否正确?

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

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

last1 should be non overlapping in comparison to last2. Lets take a look at the specific String f:[]. It would match to [x] and (x:xs) in last1.

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

In last2it would match to [y]. But not to (y:ys@(_:_)), because ys has to match (_:_) and just fulfills the first any pattern with [].

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

Now take a look at the specific String f:o:o:[]. Now the pattern (y:ys@(_:_)) matches. In this case I am curious how the binding works. What is ys after the first call? I assume it is o:o:[].

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

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