我是函数式编程的新手,特别是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:[]
。
答案 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中是相同的,因为使用了第一个匹配方程。你的第二个功能是更明确的,但第一个更惯用。