module Has (r,p,s) where
import Prelude ((==),Bool(..),otherwise,(||),Eq)
import qualified Data.List as L
filter :: (a -> Bool) -> [a] -> [a]
filter _pred [] = []
filter pred (x:xs)
| pred x = x : filter pred xs
| otherwise = filter pred xs
問題1:これfilter
はのライブラリからコピーされますが、一定数のメモリを消費する直接インポートされたとは対照的にGHC
、なぜそれがますます多くのメモリを消費するのですか。filter
elem :: (Eq a) => a -> [a] -> Bool
elem _ [] = False
elem x (y:ys) = x==y || elem x ys
問題2:これfilter
はのライブラリからコピーされますが、直接使用されるようにGHC
メモリの消費量が増えるのはなぜですか。直接インポートされるのとは対照的に、メモリの消費量も増えます。elem
filter
r = L.filter (==1000000000000) [0..]
p = filter (==1000000000000) [0..]
s = 1000000000000 `elem` [0..]
GHCバージョン:7.4.2OS:Ubuntu12.10最適化のために-O2とコンパイル
上記filter
とのelem
定義は両方を意味するp = filter (==1000000000000) [0..]
ので、とは徐々にガベージコレクションする必要があります。しかし、両方とも、ますます多くのメモリを消費します。そして、直接インポートされたもので定義されるものは、一定数のメモリを消費します。s = 1000000000000 `elem` [0..]
[0..]
p
s
r
filter
私の質問は、GHCに直接インポートされた関数が、GHCライブラリからコピーされたソースコードを使用して記述した関数と大きく異なる理由です。GHCに何か問題があるのだろうか?
さらに質問があります。上記のコードは、私が作成したプロジェクトから抽象化されたものであり、プロジェクトは「理論的にはガベージコレクションされるはずのメモリの消費量が増える」という問題にも直面しています。したがって、GHCでどの変数が非常に多くのメモリを使用しているかを見つける方法があることを知りたいと思います。
読んでくれてありがとう。