次のような機能がある場合
f x = if g x /= Nothing then g x else False
g
で2回呼び出されますか、それともf
Haskellg x
は最初のインスタンスの後に結果をキャッシュして、後で同じ行で使用できるようにしますか?私はいくつかのコードを最適化しようとしていますが、上記のスタイルの関数が私が望むよりも2倍計算コストがかかるかどうかわかりません。
前もって感謝します。
次のような機能がある場合
f x = if g x /= Nothing then g x else False
g
で2回呼び出されますか、それともf
Haskellg x
は最初のインスタンスの後に結果をキャッシュして、後で同じ行で使用できるようにしますか?私はいくつかのコードを最適化しようとしていますが、上記のスタイルの関数が私が望むよりも2倍計算コストがかかるかどうかわかりません。
前もって感謝します。
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つのブランチでのみ結果を計算して共有します。