我定义了以下功能
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])))
。这十点是什么?
其他答案指出,您需要使用-1
括号括起来。这是Haskell 98规范的一个奇怪角落,突然跳出来咬人。这不是的情况下,你永远无法不写括号负数:-1 * 5
是罚款。只是一元前缀运算符的优先级没有比二进制中缀运算符高,因此a-
通常被解析为后者。在Haskell中,运算符周围的空格并不重要。
而且无法理解的类型类错误也无济于事。顺便说一句,t10
并且t0
是由编译器由只是占位符类型的变量; 我认为这与您使用的实际数字文字无关。非正式地,像这样的错误Could not deduce (Num (a0 -> t))
通常向我表明一个函数只适用于很少的参数。
另外,NegativeLiterals
GHC 7.8中的(未记录?)语言扩展更改了-1
解决此问题的含义。
> :set -XNegativeLiterals
> :t repl 10 -1
repl 10 -1 :: Num t => [t]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句