[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条评论
登录后参与评论

相关文章

来自分类Dev

有什么更好的写方式[[-1,-1),(-1,0),(-1,1),(0,-1),(0,1),(1,-1), (1,0),(1,1)]在Haskell吗?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

sda1与sda2有何不同?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

为什么!0等于1而不是-1?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类常见问题

为什么NaN ^ 0 == 1

来自分类Dev

为什么〜0返回-1?

来自分类Dev

为什么(1/90)= 0?

来自分类Dev

Haskell在清单中升序(+1)

来自分类Dev

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

来自分类Dev

为什么在JavaScript中(([[] === [])+ /-/)[1] ='a'和(1 + {})[(1 << 1)+1] ='b'是为什么?

来自分类Dev

为什么没有以0xC1开头的Unicode?

来自分类Dev

为什么mongodb使用employee [0],employees [1],employee [2]和使用雇员[i]的for循环会有不同的输出?

来自分类Dev

为什么这些重复的SD卡的内容具有不同的sha1sum?

来自分类Dev

为什么1 +'1'='11'但1 *'1'= 1

来自分类Dev

为什么1 === 1 === 1为假?

来自分类Dev

为什么-1 >> 1计算为-1?

Related 相关文章

  1. 1

    有什么更好的写方式[[-1,-1),(-1,0),(-1,1),(0,-1),(0,1),(1,-1), (1,0),(1,1)]在Haskell吗?

  2. 2

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

  3. 3

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

  4. 4

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

  5. 5

    sda1与sda2有何不同?

  6. 6

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

  7. 7

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

  8. 8

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

  9. 9

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

  10. 10

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

  11. 11

    为什么!0等于1而不是-1?

  12. 12

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

  13. 13

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

  14. 14

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

  15. 15

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

  16. 16

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

  17. 17

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

  18. 18

    为什么NaN ^ 0 == 1

  19. 19

    为什么〜0返回-1?

  20. 20

    为什么(1/90)= 0?

  21. 21

    Haskell在清单中升序(+1)

  22. 22

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

  23. 23

    为什么在JavaScript中(([[] === [])+ /-/)[1] ='a'和(1 + {})[(1 << 1)+1] ='b'是为什么?

  24. 24

    为什么没有以0xC1开头的Unicode?

  25. 25

    为什么mongodb使用employee [0],employees [1],employee [2]和使用雇员[i]的for循环会有不同的输出?

  26. 26

    为什么这些重复的SD卡的内容具有不同的sha1sum?

  27. 27

    为什么1 +'1'='11'但1 *'1'= 1

  28. 28

    为什么1 === 1 === 1为假?

  29. 29

    为什么-1 >> 1计算为-1?

热门标签

归档