История изменений
Исправление hateyoufeel, (текущая версия) :
Что они там суперкомпилировали? Pattern matching?
Немного не в тему, но в GHC есть офигенная штука под названием rewrite rules. Можно задать компилятору паттерны в коде, которые можно преобразовать в другие паттерны. В результате, дохренища оптимизаций пишутся не внутри GHC, а на вот на этом недомакроязычке, причём библиотеки могут поставлять свой набор оптимизаций для своего API.
На практике это выглядит примерно вот так:
{-# RULES
"map fusion" forall f g. map f . map g = map (f . g)
#-}
Здесь два вызова map (т.е. два цикла прохода по списку) будут соединены в один.
Минусом идёт то, что GHC никак не проверяет и не может проверить корректность заданных таким образом преобразований, это просто подстановка кода по шаблону между стадиями парсинга и проверки типов. То есть, можно случайно наговнокодить по-крупному, если не быть аккуратным.
Исправление hateyoufeel, :
Что они там суперкомпилировали? Pattern matching?
Немного не в тему, но в GHC есть офигенная штука под названием rewrite rules. Можно задать компилятору паттерны в коде, которые можно преобразовать в другие паттерны. В результате, дохренища оптимизаций пишутся не внутри GHC, а на вот этот недомакроязычке, причём библиотеки могут поставлять свой набор оптимизаций для своего API.
На практике это выглядит примерно вот так:
{-# RULES
"map fusion" forall f g. map f . map g = map (f . g)
#-}
Здесь два вызова map (т.е. два цикла прохода по списку) будут соединены в один.
Минусом идёт то, что GHC никак не проверяет и не может проверить корректность заданных таким образом преобразований, это просто подстановка кода по шаблону между стадиями парсинга и проверки типов. То есть, можно случайно наговнокодить по-крупному, если не быть аккуратным.
Исходная версия hateyoufeel, :
Что они там суперкомпилировали? Pattern matching?
В GHC есть офигенная штука под названием rewrite rules. Можно задать компилятору паттерны в коде, которые можно преобразовать в другие паттерны. В результате, дохренища оптимизаций пишутся не внутри GHC, а на вот этот недомакроязычке, причём библиотеки могут поставлять свой набор оптимизаций для своего API.
На практике это выглядит примерно вот так:
{-# RULES
"map fusion" forall f g. map f . map g = map (f . g)
#-}
Здесь два вызова map (т.е. два цикла прохода по списку) будут соединены в один.
Минусом идёт то, что GHC никак не проверяет и не может проверить корректность заданных таким образом преобразований, это просто подстановка кода по шаблону между стадиями парсинга и проверки типов. То есть, можно случайно наговнокодить по-крупному, если не быть аккуратным.