4

私の最初の haskell プログラムとして、私はこれをやろうとしています - 1 から 10 を取得するのは難しい方法です。私は整数の無限リストを構築し、それらをソートし、最初の 10 を取得しています。要求された結果に厳密に (エヘム) 必要な範囲を超えてそれらの評価を引き起こすことなく、無限リストを操作できました。

私のコードは..

module Main where

import Data.List

minima n xs = take n (sort xs)

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

ghc でコンパイルし、結果として得られる実行可能ファイルを実行します。殺されるまでそこに座って割り当てます。

ヒントはありますか?

4

3 に答える 3

12

問題は、無限リストをソートしようとしていることです。リスト内のすべての要素が判明するまで、リストを完全にソートすることはできないため、ハングしています。あなたのプログラムは、有限リストで問題なく動作します。

また、マイナーなことはさておき、次のように minima を書き換えることができます。

minima n = take n . sort

部分適用のためminima n、リストを期待する関数を返します。

于 2009-09-20T06:14:01.617 に答える
7

有限の時間内に無限のリストをソートすることは不可能です。

証拠として、並べ替えには最小要素を見つけることが含まれていることを考慮してください。無限リストの最小値を見つけるには、リスト内のすべての要素をチェックする必要があり、無限の時間がかかります。

ただし、あなたの場合、リストは既にソートされていることがわかっています。これにより、無限リストのソート、つまりソート済みリストのソートの特殊なケースになります。このケースは解決可能です。

于 2009-09-20T11:25:00.447 に答える
2

無限リストをソートしようとしています。

于 2009-09-20T06:34:00.660 に答える