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

时间:2013-05-18 17:12:41

标签: haskell lazy-evaluation

我怀疑为什么Haskell无法处理以下行

Prelude> take 1000000000000 $ repeat ' '

该代码行将返回:

""

显然不是1,000,000,000,000个空格。

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

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

Prelude> repeat ' '

它会起作用,即使是更多零的很多

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

1 个答案:

答案 0 :(得分:11)

你是32位系统吗?我怀疑1000000000000将Int换成负数。它等于大约2^40

您可以输入1000000000000 :: Int来查看正在发生的事情。

带有负数的

take只返回空列表:

Prelude> take (- 1) [1,2,3]
[]

作为参考,take只需Int

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