Se eu tiver uma função fun
como:
-- 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 ...
e então eu chamo fun
em lugares diferentes no meu programa, o código produzido pelo GHC chamará fun
todas as vezes ou será substituído por alguma "referência" ao resultado desta função nula (na verdade constante), como os compiladores C fazem com constantes? Algo como "chame pela primeira vez e depois substitua por esse valor em qualquer lugar em qualquer profundidade de aninhamento" (ou o GHC poderia fazer isso mesmo sem chamada), é possível? Preciso de alguns sinalizadores de compilador especiais para isso (eu uso apenas -O2
atualmente)?
No GHC,
fun
será compilado para um objeto que, quando avaliado pela primeira vez, se sobrescreve pelo valor avaliado. Isso acontecerá mesmo sem nenhuma otimização ativada. (Na verdade, desativar esse comportamento é uma tarefa difícil, e não ativá-lo.)