わかりました、これはしばらく私を悩ませていたので、実際に答えを知っているかもしれない誰かに来て聞いてみようと思いました.
次の関数があるとします。
foobar x y = expensive x + cheap y
さらに、プログラムの一部がfoobar 5
入力として受け取り、この関数をタイトなループで何百万回も実行するとします。expensive 5
明らかに、私は 100 万回ではなく 1 回計算されたいのです。
コードをそのままにしておくことも、次のように変更することもできます
foobar x = let k = expensive x in \ y -> k + cheap y
これは私を不思議に思います...
GHC は重複作業を自力で排除できるほどスマートですか? (つまり、最初のバージョンは私がすでに望んでいることをしますか?)
「いいえ」の場合、2 番目のバージョンで実際に問題が解決しますか? (つまり、オプティマイザはそれを最初のバージョンと同じコードに変換するだけでしょうか?)