1

fromRangeフィルター関数と間隔を取り、フィルター関数を満たす間隔内のすべての要素を含むセットを返す関数があります。

リスト内包表記を使用して実装しました。

fromRange   :: (Integer->Bool) -> (Integer,Integer)  -> [Integer]
fromRange f (x,y) = [i | i<-[x..y], f i]

しかし、大きなリストでは非常に時間がかかるため、遅延評価の概念を見つけましたが、それを正確に実装する方法がわかりません。

4

1 に答える 1

6

遅延評価は、大規模なデータセットに対して高速であるとは想定されていません。値が必要になる瞬間まで評価を延期するだけです。たとえば、次のように入力するとghci:

fromRange (< 50) (1, 1000000000)

リスト全体を繰り返し処理してフィルター処理し、結果を出力するまで、永遠に待つ必要があります。

一方で:

take 10 $ fromRange (< 50) (1, 1000000000)

リストの残りを計算する必要がないため、すぐに完了します。

注:take 100十分なエントリが見つからないため、同様にハングします。

于 2012-11-20T15:36:37.400 に答える