LINUX.ORG.RU

История изменений

Исправление 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 никак не проверяет и не может проверить корректность заданных таким образом преобразований, это просто подстановка кода по шаблону между стадиями парсинга и проверки типов. То есть, можно случайно наговнокодить по-крупному, если не быть аккуратным.