[解決済み] 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)
そして、これをもう一度特殊化すると、一番左の
id
で
id id id
にすると、得られる。
id :: ((a -> a) -> (a -> a)) -> ((a -> a) -> (a -> a))
ということは、それぞれの
id
を追加すると、一番左の
id
は2倍の大きさになります。
型はコンパイル時に削除されるので、GHCの中でのみメモリを消費することに注意してください。 あなたのプログラムではメモリを消費することはありません。
関連
-
[解決済み】なぜパースエラーになるのか?インデント?
-
[解決済み] Haskellです。パターンでのパースエラー
-
[解決済み] .の違いは何ですか?(ドット)と$(ドルマーク)の違いは何ですか?
-
[解決済み] Haskellで大規模設計?[クローズド]
-
[解決済み] フリーモナドとは何ですか?
-
[解決済み] GHCはどのような最適化を確実に実行することが期待できますか?
-
[解決済み] ghciで関数を複数行に渡って定義するには?
-
[解決済み] Haskellのマルチコアプログラミングはどうなっているのか?
-
[解決済み] Haskell型とデータコンストラクタ
-
[解決済み] GHCでコンパイルした小さなHaskellプログラムを巨大なバイナリにする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] なぜHaskellでは整数の割り算ができないのか?
-
[解決済み] Haskellで "length "関数を使用しない場合のリストの長さ
-
[解決済み] 解釈の仕方 (Eq a)
-
[解決済み] Haskellで大規模設計?[クローズド]
-
[解決済み] 読んで学ぶべき良いHaskellのソース [終了しました]。
-
[解決済み] Haskell における `mod` と `rem` の違い
-
[解決済み] Haskellのリストを参照する際の「@」記号の意味は?
-
[解決済み] TLSサーバーを実装するためのHsOpenSSL APIの適切な使用法
-
[解決済み] Rank2Typesの目的は何ですか?
-
[解決済み] Haskell エラー 入力 `=' のパースエラー