0

次のような機能がある場合

f x = if g x /= Nothing then g x else False

gで2回呼び出されますか、それともfHaskellg xは最初のインスタンスの後に結果をキャッシュして、後で同じ行で使用できるようにしますか?私はいくつかのコードを最適化しようとしていますが、上記のスタイルの関数が私が望むよりも2倍計算コストがかかるかどうかわかりません。

前もって感謝します。

4

1 に答える 1

14

Haskellの実装は関数呼び出しをメモ化しません。

GHCなどのHaskellコンパイラは、一般的な部分式除去を行いますが、制限があります。

疑わしい場合は、結果を共有してください。

f x = if g' /= Nothing then g' else False
    where g' = g x

ただし、g'はブール値と多分の両方になることはできないため、型エラーが発生します。

しかし、次のように書く方がよいでしょう。

f x = case g x of
          Nothing -> ..
          Just _  -> ..

1つのブランチでのみ結果を計算して共有します。

于 2013-03-01T23:08:03.480 に答える