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
takesInt
。这只是前奏曲的一个怪癖。1000000000000::Int32
的计算结果准确地说是-727379968
。另请参阅:。