当我遇到99 Problems in Haskell到solution但我并不完全理解时,我正在执行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 = ...
而前一个定义编译得很好。
答案 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时才匹配,如您所怀疑的那样。您的替代代码会删除此限制,从而导致重叠模式匹配。