如果我有一个像这样的功能fun
:
-- For example, `SomeRecord` can have more than 2 fields,
-- but 20 or 30
data SomeRecord a b = SomeRecord {
f1 :: a -> b,
f2 :: a -> b -> Bool
}
fun :: SomeRecord Int Bool
fun = SomeRecord ...
然后我fun
在程序的不同位置调用,GHC 生成的代码fun
每次都会调用吗?还是会被替换为对这个零元(实际上是常量)函数结果的某些“引用”,就像 C 编译器对常量所做的那样?像“第一次调用它,然后在任何嵌套深度的任何地方都用这个值替换”(或者 GHC 甚至可以在不调用的情况下做到这一点),这可能吗?我需要一些特殊的编译器标志吗(我-O2
目前只使用)?
在 GHC 中,
fun
将编译为一个对象,当第一次评估时,该对象将用评估值覆盖自身。即使没有打开任何优化,也会发生这种情况。(事实上,关闭该行为是一项艰巨的任务,而不是启用它。)