给定以下代码:
{-# OPTIONS_GHC -funbox-strict-fields #-}
module Test where
data X = X !Int !Int
test (X a b) (X c d) = X (max a c) (max b d)
GHC在使用优化进行编译时生成此核心(重命名以便于阅读):
test
test =
\ u v ->
case u of x { X y z ->
case v of c { X d e ->
case tagToEnum# (<=# y d) of _ {
False ->
case tagToEnum# (<=# z e) of _ {
False -> x;
True -> X y e
};
True ->
case tagToEnum# (<=# z e) of _ {
False -> X d z;
True -> c
}
}
}
}
注意GHC是如何产生总计
4.
不同的代码路径。通常,代码路径的数量随着条件的数量呈指数增长。
什么GHC优化导致了这种行为?是否有控制此优化的标志?在我的例子中,这会产生巨大的代码膨胀,并且由于深度嵌套的case表达式,使得核心转储非常难以读取。