Haskell as模式的功能,通过'的非重叠模式;as模式';
我不熟悉函数式编程,尤其是haskell,对于模式和通过使用它减少重叠,我有两个问题。 给出以下代码示例:Haskell as模式的功能,通过'的非重叠模式;as模式';,haskell,design-patterns,overlapping-matches,as-pattern,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 与last2相比
last1 :: [a] -> a
last1 [x] = x
last1 (x:xs) = last xs
last2 :: [a] -> a
last2 [y] = y
last2 (y:ys@(_:_)) = last ys
与last2
相比,last1
应该不重叠。
让我们看看特定的字符串f:[]
。它将与last1
中的[x]
和(x:xs)
匹配
在last2
中,它将与[y]
匹配。但是不要使用(y:ys@(:))
,因为ys
必须匹配(:uu)
,并且只使用[]
实现第一个任意模式
我的假设正确吗
现在看看特定的字符串
f:o:o:[]
。现在模式(y:ys@(:))
匹配。在这种情况下,我很好奇绑定是如何工作的。第一次呼叫后的ys
是什么?我假设它是o:o:[]
在这两种情况下,您的递归都将是last
,而不是last1
/last2
与last2
相比,last1
应该不重叠。
让我们看看特定的字符串f:[]
。它将与last1
中的[x]
和(x:xs)
匹配
它可以匹配(x:xs)
,但不会匹配,因为模式匹配只匹配第一次成功。重叠在这方面并不含糊(始终采用第一个定义)
在last2
中,它将与[y]
匹配。但是不要使用(y:ys@(:))
,因为ys
必须匹配(:uu)
,并且只使用[]
实现第一个任意模式
你的措辞有点奇怪,但你是正确的,f:[]
不能与(y:ys@(:u))匹配,因为后者基本上与(不匹配的)匹配
现在看看特定的字符串f:o:o:[]
。现在模式(y:ys@(:))
匹配。在这种情况下,我很好奇绑定是如何工作的。第一次呼叫后的ys
是什么?我假设它是o:o:[]
ys
等于o:o:[]
(或“oo”
或[o,o]
)。在Haskell中,使用第一个匹配方程时,这两个函数是相同的。您的第二个函数更明确一些,但第一个函数更惯用。为什么不x1:x2:
?我看不出有任何理由在这里使用“as”模式。这是我的教授描述as模式和绑定的一个例子。但这与其说是一种解释,不如说是一种提及。@dredozubov:你怎么知道在你的例子中应该重复什么?@Guvante我的观点是:没有必要这样做subexpressions@dredozubov:您的示例会删除列表的其余部分,因此无法工作x1:x2:xs
可以工作,但是x1:x2:
无法在列表的其余部分重复出现,因此无法获取最后一项。