我是函数式编程的新手,尤其是 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:[]
。