Eug*_*gen 20 haskell pattern-matching
我在做99点的问题在Haskell当我遇到了一个解决方案,以问题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"
Run Code Online (Sandbox Code Playgroud)
提供的解决方案是
rotate [] _ = []
rotate l 0 = l
rotate (x:xs) (n+1) = rotate (xs ++ [x]) n
rotate l n = rotate l (length l + n)
Run Code Online (Sandbox Code Playgroud)
我不明白模式匹配如何达到第四行.它似乎与这个有关,(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)
Run Code Online (Sandbox Code Playgroud)
是等价的.但事实并非如此.该定义给出以下警告
Warning: Pattern match(es) are overlapped
In the definition of `rotate': rotate l n = ...
Run Code Online (Sandbox Code Playgroud)
而前一个定义编译得很好.
Tho*_*mas 27
这是所谓的"n + k模式"的一个特例,它通常是不受欢迎的,并且将从语言中删除.有关更多信息,请参见此处
以下是关于n + k模式的一个很好的说明,它引用了Haskell 98报告中的以下内容(强调我的):
如果x> = k,则将 n + k模式(其中n是变量,k是正整数文字)与值v匹配成功,导致n与x-k的绑定,否则失败.同样,函数> =和 - 被重载,具体取决于模式的类型.如果比较发生变化,则匹配会发生变化.
除了只允许整数文字外,对文字k的解释与数字文字模式相同.
所以n+1只有n至少为1 才会匹配,如您所怀疑的那样.您的替代代码会删除此限制,从而导致重叠模式匹配.