我已经定义了以下功能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