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