Haskellには、入力を変更せずに返す恒等関数があります。定義は簡単です:
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
数秒後(およびタスクマネージャーによると約2 GBのメモリ)、コンパイルはghc: out of memory
で失敗します。同様に、インタープリターはghci: out of memory
と言います。
id
は非常に単純な関数であるため、実行時またはコンパイル時にメモリの負荷になるとは思わないでしょう。使用されているすべてのメモリは何ですか?
id
のタイプはわかっています。
id :: a -> a
そして、これをid id
に特化すると、左id
のコピーのタイプは次のようになります。
id :: (a -> a) -> (a -> a)
そして、これをid id id
の左端のid
に再度特化すると、次のようになります:
id :: ((a -> a) -> (a -> a)) -> ((a -> a) -> (a -> a))
したがって、各id
を追加すると、左端のid
の型シグネチャが2倍になります。
タイプはコンパイル中に削除されるため、GHCのメモリのみを使用することに注意してください。プログラムのメモリを占有しません。