[1 .. 0]与Haskell中的[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])))这十点是什么?

克里斯蒂安·康克尔

其他答案指出,您需要使用-1括号括起来。这是Haskell 98规范的一个奇怪角落,突然跳出来咬人。不是的情况下,你永远无法不写括号负数:-1 * 5是罚款。只是一元前缀运算符的优先级没有比二进制中缀运算符高,因此a-通常被解析为后者。在Haskell中,运算符周围的空格并不重要。

而且无法理解的类型类错误也无济于事。顺便说一句,t10并且t0是由编译器由只是占位符类型的变量; 我认为这与您使用的实际数字文字无关。非正式地,像这样的错误Could not deduce (Num (a0 -> t))通常向我表明一个函数只适用于很少的参数。

另外,NegativeLiteralsGHC 7.8中的(未记录?)语言扩展更改了-1解决此问题的含义

> :set -XNegativeLiterals
> :t repl 10 -1
repl 10 -1 :: Num t => [t]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在Haskell中0 ^ 0 == 1?

为什么 (x & 0) 与 (x & ~1) 不同?

什么是LR(2)解析器?它与LR(1)解析器有何不同?

为什么a [:] = 1与a [:] ='1'根本不同?

为什么a [:] = 1与a [:] ='1'根本不同?

make(chan bool)与make(chan bool,1)有何不同?

计数前导/尾随的1 /零的效率有何不同?

sda1与sda2有何不同?

在R中,为什么不-1 + 1 = 0

如果值是0(数字零),为什么$ 1的awk会有不同的表现?

为什么-1 >> 1和0xFFFFFFFF >> 1会产生不同的结果?

“ $ {PS1-}”是否有效?语法与普通的“ $ PS1”有何不同?

为什么在JavaScript(Coercion)中1 +'1'='11'和1-'1'= 0?

为什么fscanf(...)!= 0与fscanf(...)== 1做不同的事情?

C编程:为什么(0 || -1)== 1?

为什么#if 0 vs #if(1> 1)?

为什么为 dx[dir 选择值 {1, 1, 0, -1, -1, -1, 0, 1} 和 {0, 1, 1, 1, 0, -1, -1, -1} ] 和 dy[dir]?

使用DD时bs = 1 count = 512与bs = 512 count = 1有何不同

bash:为什么$ {@:-1}的值不同于$ {@:-1}?

为什么(1/90)= 0?

为什么〜0返回-1?

为什么在JavaScript中“ 1” + +“ 1” =“ 11”但“ 1”--“ 1” = 2

为什么`minimum(1,2)`在Haskell中返回2?

Haskell在清单中升序(+1)

为什么是'if(1 == 1 == 1 == 1 == 1);' 正确,但'if(-1 == -1 == -1 == -1 == -1);' 假?

为什么Object.keys([,1,,1])与Object.keys([,1,undefined,1])不同?

在 JavaScript 中,为什么 2 > 1 > 0 true 而 8 > 1 > 1 false?

为什么在Python中{1} == Frozenset({1})?

为什么-1j和0-1j变成不同的字符串?