模式匹配中的Haskell(n + 1)

时间:2011-02-06 13:30:46

标签: haskell pattern-matching

当我遇到99 Problems in Haskellsolution但我并不完全理解时,我正在执行Problem 19

任务是编写一个像这样工作的旋转函数

*Main> rotate ['a','b','c','d','e','f','g','h'] 3
"defghabc"

*Main> rotate ['a','b','c','d','e','f','g','h'] (-2)
"ghabcdef"

提供的解决方案之一是

rotate [] _ = []
rotate l 0 = l
rotate (x:xs) (n+1) = rotate (xs ++ [x]) n
rotate l n = rotate l (length l + n)

我不明白模式匹配如何到达第四行。这似乎与(n+1)有关,因此当n为负时,第三行不匹配,因此第四行被采用。如果是这种情况,为什么符号(n+1)以这种方式工作。是不是那么武断,或者是一个我不知道的惯例(数学?)?

因为我理解的方式是在第三行递归调用rotate,参数n减1。所以我认为

rotate [] _ = []
rotate l 0 = l
rotate (x:xs) n = rotate (xs ++ [x]) (n-1)
rotate l n = rotate l (length l + n)

是等价的。但事实并非如此。该定义提供以下警告

Warning: Pattern match(es) are overlapped
         In the definition of `rotate': rotate l n = ...

而前一个定义编译得很好。

1 个答案:

答案 0 :(得分:27)

这是所谓的“n + k模式”的特定情况,通常不喜欢,will be has been removed from the language。有关详细信息,请参阅here

Here是关于n + k模式的一个很好的说明,引用了Haskell 98报告中的以下内容(强调我的):

  

匹配n + k模式(其中n是a   变量和k是正整数   (文字)对价值v 成功   x> = k ,导致n的结合   到x - k,否则失败。再次,   函数> =和 - 重载,   取决于模式的类型。   如果进行比较,比赛会发生分歧   发散。

     

字面意思k的解释是   与数字文字相同   模式,只有整数   允许文字。

因此n+1仅在n至少为1时才匹配,如您所怀疑的那样。您的替代代码会删除此限制,从而导致重叠模式匹配。