Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 为什么带大数字的'take'返回[],即使列表是无限的?_Haskell_Lazy Evaluation - Fatal编程技术网

Haskell 为什么带大数字的'take'返回[],即使列表是无限的?

Haskell 为什么带大数字的'take'返回[],即使列表是无限的?,haskell,lazy-evaluation,Haskell,Lazy Evaluation,我怀疑为什么哈斯克尔不能处理下面这句话 Prelude> take 1000000000000 $ repeat ' ' 该行代码将返回: "" 这显然不是1000000000000个空格 如果我尝试少一个零,它将打印很长时间 最让我困扰的是如果我只是写 Prelude> repeat ' ' 它将起作用,即使是更多的零 那么,为什么Haskell不能像单独使用repeat那样长时间打印呢?您使用的是32位系统吗?我怀疑10000000000将Int包装成一个负数。大约等于2^

我怀疑为什么哈斯克尔不能处理下面这句话

Prelude> take 1000000000000 $ repeat ' '
该行代码将返回:

""
这显然不是1000000000000个空格

如果我尝试少一个零,它将打印很长时间

最让我困扰的是如果我只是写

Prelude> repeat ' '
它将起作用,即使是更多的零


那么,为什么Haskell不能像单独使用
repeat
那样长时间打印呢?

您使用的是32位系统吗?我怀疑10000000000将
Int
包装成一个负数。大约等于
2^40

您可以通过输入
10000000000::Int
来检查发生了什么

take
带负数只返回空列表:

Prelude> take (- 1) [1,2,3]
[]
作为参考,
take
仅用于
Int

Prelude> :t take
take :: Int -> [a] -> [a]

take
takes
Int
。这只是前奏曲的一个怪癖。
1000000000000::Int32
的计算结果准确地说是
-727379968
。另请参阅:。