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 last2
it 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中是相同的,因为使用了第一个匹配方程。你的第二个功能更明确一点,但第一个功能更惯用。
我是函数式编程的新手,尤其是 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 tolast2
. Lets take a look at the specific Stringf:[]
. It would match to[x]
and(x:xs)
inlast1
.
它可以匹配 (x:xs)
但它不会匹配,因为模式匹配只会匹配第一次成功。重叠在这方面没有歧义(总是采用第一个定义)。
In
last2
it would match to[y]
. But not to(y:ys@(_:_))
, becauseys
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 isys
after the first call? I assume it iso:o:[]
.
ys
等于 o:o:[]
(或 "oo"
或 [o,o]
)。
两个函数在Haskell中是相同的,因为使用了第一个匹配方程。你的第二个功能更明确一点,但第一个功能更惯用。