2011-02-06 67 views
20

當我遇到solutionProblem 19時,我在做99 Problems in Haskell,我沒有完全理解。模式匹配中的Haskell(n + 1)

任務是編寫工作原理是這樣

*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)這樣工作。不是那種武斷的,或者是我沒有意識到的習慣(數學?)?

因爲我理解的方式是,在第三行中遞歸調用旋轉,參數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 = ... 

而前者的定義編譯得很好。

回答

26

這是所謂的「n + k模式」的特定情況,通常不喜歡,並且will be has been removed from the language。有關更多信息,請參見here

Here是n + k中圖案的很好的說明,其中引用了Haskell的98報告(重點煤礦)執行以下操作:

匹配的n + k中圖案(其中n是 變量並且k是一個正整數 字面值)v 成功,如果 x> = k,導致n 與x-k的綁定,否則失敗。再次, 函數> =和 - 被重載, 取決於模式的類型。 如果比較 分歧,則匹配發散。

文字k的解釋是 與數字文字 相同,但只允許使用整數 文字。

因此,如果您懷疑n至少爲1,那麼n+1纔會匹配。您的替代代碼將刪除此限制,從而導致模式匹配重疊。

+0

「這是所謂的」n + k模式「的特定情況,通常不喜歡」。我認爲更好的解決方案可能會引入一種自然數的類型,可用於表示* size *,並定義自然數上的* n + 1 *模式。在Haskell和大多數語言(如C/C++)中缺少這種類型,我們看到定義`unsigned int`,`size_t`(這真的很自然)以及相關的signed和unsigne類型之間的比較問題等等的痛苦。自然,我們可以對結構的大小進行案例分析,這是非常基礎的,而且在Haskell中很容易。 – tinlyx 2016-01-05 15:01:31