【问题标题】:Why does `take` with a large number return [] even though the list is infinite?为什么即使列表是无限的,大数的`take`也会返回[]?
【发布时间】:2013-05-18 17:12:41
【问题描述】:

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

Prelude> take 1000000000000 $ repeat ' '

那行代码会返回:

""

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

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

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

Prelude> repeat ' '

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

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

【问题讨论】:

    标签: haskell lazy-evaluation


    【解决方案1】:

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

    您可以通过输入1000000000000 :: Int 来查看发生了什么。

    take 带负数只返回空列表:

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

    供参考,take 只取Int

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

    【讨论】:

    • take 接受Int。这只是前奏曲的一个怪癖。
    • 1000000000000 :: Int32 计算结果为 -727379968,确切地说。另请参阅:genericTake
    猜你喜欢
    • 2012-06-13
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    • 2019-10-03
    相关资源
    最近更新 更多