Автоматическая вставка лени в Haskell - PullRequest
0 голосов
/ 15 сентября 2018

Сопоставление с шаблоном в Haskell часто является строгим, например, f (x:xs) = ... требует, чтобы список входных данных оценивался как ( thunk : thunk ). Но иногда такая оценка не нужна, и функция может позволить себе быть нестрогой в отношении некоторых аргументов, например f (x:xs) = 3.

В идеале, в таких ситуациях мы могли бы избежать оценки аргументов, чтобы получить поведение const 3, что можно сделать с неопровержимым шаблоном: f ~(x:xs) = 3. Это дает нам преимущества в производительности и большую устойчивость к ошибкам.

Мой вопрос: GHC уже осуществляет такие преобразования с помощью какого-либо анализа строгости? Цените это, если вы могли бы также указать мне на некоторые чтения на нем.

1 Ответ

0 голосов
/ 15 сентября 2018

Насколько я знаю, GHC никогда не сделает более ленивым , чем указано программистом, даже если он может доказать, что это не меняет семантику термина. Я не думаю, что есть какая-либо фундаментальная причина избегать изменения лени термина, когда мы можем доказать, что семантика не меняется; Я подозреваю, что это скорее эмпирическое наблюдение, что мы не знаем ни одной ситуации, когда это было бы действительно отличной идеей. (И если преобразование изменит семантику, я бы посчитал ошибкой для GHC внести это изменение.)

На ум приходит только одно возможное исключение, так называемое преобразование "полной лени", которое хорошо описано в вики . Короче, GHC переведет

\a b -> let c = {- something that doesn't mention b -} in d

до

\a -> let c = {- same thing as before -} in \b -> d

, чтобы избежать повторного вычисления c каждый раз, когда аргумент применяется к новому b. Но мне кажется, что эта трансформация больше связана с запоминанием, чем с ленью: мне кажется, что два приведенных выше термина имеют одинаковую (денотационную) семантику с ленью / строгостью и отличаются только в функциональном отношении.

...