1. ホーム
  2. haskell

[解決済み] Haskellの「何もしない」関数、idはなぜ大量のメモリを消費するのか?

2022-09-28 03:20:10

質問

Haskellには、入力を変更せずに返すidentity関数があります。定義は簡単です。

id :: a -> a
id x = x

というわけで、面白いことに、このように出力されるはずです。 8 :

f = id id id id id id id id id id id id id id id id id id id id id id id id id id id
main = print $ f 8

数秒後(タスクマネージャによると約2GBのメモリ)、コンパイルに失敗して ghc: out of memory . 同様に、インタプリタでは ghci: out of memory .

このため id は非常に単純な関数なので、実行時やコンパイル時にメモリの負担になるとは思えません。このメモリは何に使われているのでしょうか?

どのように解決するのですか?

のタイプはわかっています。 id ,

id :: a -> a

で、これを特殊化すると id id に対して特殊化すると のコピー id は型を持ちます。

id :: (a -> a) -> (a -> a)

そして、これをもう一度特殊化すると、一番左の idid id id にすると、得られる。

id :: ((a -> a) -> (a -> a)) -> ((a -> a) -> (a -> a))

ということは、それぞれの id を追加すると、一番左の id は2倍の大きさになります。

型はコンパイル時に削除されるので、GHCの中でのみメモリを消費することに注意してください。 あなたのプログラムではメモリを消費することはありません。