如果我有类似以下的功能
f x = if g x /= Nothing then g x else False
g
将f
调用两次,或者Haskell'缓存'第一个实例后g x
的结果可能在以后的同一行中使用?我试图优化一些代码,但我不知道上面那些代码的功能是否比我想要的那么贵。
提前致谢。
答案 0 :(得分:14)
Haskell实现不会记忆函数调用。
GHC等Haskell编译器执行do common subexpression eliminiation但存在限制。
如有疑问,请分享结果。
f x = if g' /= Nothing then g' else False
where g' = g x
但是你有一个类型错误,因为g'不能同时是一个布尔值和一个Maybe。
但写得更好:
f x = case g x of
Nothing -> ..
Just _ -> ..
仅在一个分支中计算和共享结果。