我已經定義了以下功能Haskell中[1 .. 0]與[1 .. -1]的區別和原因?
let repl x n = [x | _ <- [1..n]]
模仿內置的複製功能。
雖然用它進行試驗,我發現一個奇怪的事情:repl 10 0
評估爲[]
,而repl 10 -1
產生一個錯誤:
No instance for (Show (t10 -> [t0])) arising from a use of ‘print’
In a stmt of an interactive GHCi command: print it
在另一方面,無論[1 .. 0]
和[1 .. -1]
評估爲[]
而不會產生任何錯誤。
此外,[42 | _ <- [1 .. 0]]
和[42 | _ <- [1 .. -1]]
都評估爲[]
沒有錯誤。
那麼,爲什麼我的函數調用會導致錯誤,其中顯式替換不會?更重要的是,[1 .. 0]
和[1 .. -1]
之間的明顯區別在哪裏?
而最後一個問題:當我寫:
repl 42 -1
錯誤是完全一樣與repl 10 -1
,即它仍然有(Show (t10 -> [t0]))
位在裏面。我期待它有類似((Show (t42 -> [t0])))
。這是什麼10?
您可能會發現這些問題的答案有所幫助:[前綴一元運算符(http://stackoverflow.com/questions/3406320/前綴外形的-一元 - 操作者在-哈斯克爾/ 3406692#3406692); [爲什麼我不能乘以沒有括號的負數](http://stackoverflow.com/questions/26073878/); [有趣的參數有趣的haskell行爲](http://stackoverflow.com/questions/14741552/)。 – 2014-11-23 16:55:38