【发布时间】:2015-08-03 19:17:33
【问题描述】:
我是函数式编程的新手,尤其是 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:[]。它将匹配last1 中的[x] 和(x:xs)。
在last2中,它将匹配[y]。但不适用于(y:ys@(_:_)),因为ys 必须匹配(_:_) 并且只满足[] 的第一个any 模式。
我的假设正确吗?
现在看看具体的字符串f:o:o:[]。现在模式 (y:ys@(_:_)) 匹配。在这种情况下,我很好奇绑定是如何工作的。第一次通话后ys 是什么?我假设它是o:o:[]。
【问题讨论】:
-
为什么不
x1:x2:_?我看不出有什么理由在这里使用“as”模式。 -
这是我教授的一个示例,用于描述模式和绑定。但这与其说是解释,不如说是提及。
-
@dredozubov:你怎么知道在你的例子中递归什么?
-
@Guvante 我的意思是:没有必要给子表达式起别名
-
@dredozubov:您的示例删除了列表的其余部分,因此无法工作。
x1:x2:xs可以工作,但x1:x2:_不能在列表的其余部分上递归,因此无法获得最后一项。
标签: haskell design-patterns overlapping-matches as-pattern