为什么ghc评估我的无限名单?

时间:2009-09-20 06:05:47

标签: haskell lazy-evaluation

作为我的第一个haskell程序,我正在尝试这样做 - 这是获得1到10的难点。我正在构建一个无限的整数列表,并对它们进行排序,然后取第一个10.我的意图是说服自己,我可以使用无限列表,而不会超出要求结果所要求的严格( ahem )之外的评估。

我的代码是..

module Main where

import Data.List

minima n xs = take n (sort xs)

main = do
    let x = [1..] 
    print (minima 10 x)

使用ghc进行编译并运行生成的可执行文件..它在那里分配直到被杀死。

任何提示?

3 个答案:

答案 0 :(得分:12)

问题是你正试图对无限列表进行排序。在列表中的所有元素都已知之前,列表永远不能完全排序,这就是它挂起的原因。您的程序可以使用有限列表正常工作。

另外,作为一个小问题,您可以将最小值重写为

minima n = take n . sort

由于部分应用,minima n将返回一个期望列表的函数。

答案 1 :(得分:7)

在有限的时间内对无限列表进行排序是不可能的。

作为证据,考虑排序包括找到最小元素,并找到无限列表的最小值,你必须检查列表中的每个元素,这将花费无限时间。

但是,在您的情况下,您知道列表已经排序。这使得它成为排序无限列表的特殊情况,即对排序列表进行排序。这种情况是可以解决的。

答案 2 :(得分:2)

您正在尝试对无限列表进行排序。