Учитывая следующий код:Какая оптимизация GHC отвечает за дублирование выражений case?
{-# 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 сгенерировал в общей сложности различных путях коды , В общем случае количество кодовых путей растет экспоненциально с числом условий.
Какая оптимизация GHC ведет к такому поведению? Есть ли флаг для управления этой оптимизацией? В моем случае это создает огромный раздутый код, и делает основные дампы очень трудными для чтения из-за глубоко вложенных выражений case.
Вы на 100% уверены, что это оптимизация? Я всегда думал, что оператор Core case был ограничен, чтобы выполнять одно совпадение шаблона за раз, и, таким образом, этот тип вложенных 'case' необходим при обработке нескольких шаблонов в определении. – Bakuriu
О, хм, я клянусь, что он создал что-то еще без оптимизации. Но теперь, когда я пытаюсь воспроизвести, это уже не так. Позвольте мне проверить ... – bennofs