Существует ли компилятор или препроцессор Haskell, который использует строгую оценку?

StackOverflow https://stackoverflow.com/questions/996052

Вопрос

Я ищу компилятор Haskell, который использует строгую оценку по умолчанию вместо отложенной оценки.Я бы просто использовал OCaml, но синтаксис Haskell таков так намного лучше чем у OCaml (а Haskell чистый и обладает классными функциями, такими как классы типов).

Я бы действительно предпочел не ставить постоянно !ы и $!это во всей моей программе.Компилятор с переключателем или препроцессором для добавления аннотаций строгости был бы действительно хорош.Также было бы полезно, если бы существовал способ использовать отложенную оценку и в определенных местах, на всякий случай, если я захочу что-то вроде бесконечного списка (я, вероятно, никогда этого не сделаю).

Пожалуйста, не пытайтесь убедить меня, что ленивая оценка лучше, мне действительно нужна производительность.IIRC, Саймон Пейтон Джонс, даже сказал, что ленивая оценка на самом деле не нужна, она была там в основном для того, чтобы они не делали язык нечистым.

Это было полезно?

Решение

Если у вас есть компилятор Haskell, который использует строгую оценку, он не составляет Haskell. Лень Нестария является частью спецификации Haskell!

Однако есть альтернативы.

  • DDC это попытка создать явно ленивый вариант Хаскелла, который поддерживает такие вещи, как разрушительное обновление, сохраняя при этом все остальные доброты Хаскелла. Существует одна проблема: компилятор в настоящее время находится только на α-стадии, хотя, по крайней мере, он может использоваться.

  • Создайте препроцессор, как и другие.

  • Научитесь использовать Haskell «правильный путь». Если вы можете упростить свой тестовый пример до того, что общедоступно, вы можете опубликовать его на Список рассылки Haskell-Café, где люди очень полезны с подобными вопросами, касающимися последствий нетронутой.

Другие советы

Я действительно не предпочел бы не постоянно положить! S и $! S по всей моей программе

Вы делаете это неправильно, если вы так программируете Haskell :) вам просто не нужно это делать. Используйте GHC, используйте -O2, используйте строгие типы данных, когда это необходимо, используйте ленивые при необходимости. Не думайте, что лень будет проблемой - это решение многих проблем.

В прошлом было две попытки строго оценить Хаскелл:

Но оба были сосредоточены на том, чтобы придерживаться нетронутой семантики Хаскелла, но использовали в основном стратегию оценки, а не на самом деле изменение семантики, и ни один из них не видел света дня.

РЕДАКТИРОВАТЬ: Предложение Martijn о строгих плугине выглядит идеально для ваших целей, поскольку он на самом деле делает то, что вы хотите, и автор все еще активен в сообществе Haskell, я забыл об этом.

Смотрите также GHC-Strict-Plugin, пример для Плагин GHC Framework, описано в Монад читатель 12.

Я чувствую твою боль.Моя самая большая проблема в моем повседневном программировании - это справиться с ними!@#$%^& (утечки пространства.

Однако, если это помогает, со временем вы узнаете (на собственном горьком опыте), как с этим бороться, и это действительно становится лучше.Но я все еще жду, когда Энди Гилл выйдет со своим волшебным профилировщиком утечек в пространстве, чтобы решить все мои проблемы.(Я использую его небрежный комментарий в мой адрес на последнем ICFP о том, что он придумал эту классную идею в качестве обещания реализовать ее.)

Я не буду пытаться убедить вас в том, что ленивая оценка - лучшая вещь в мире, но в ней есть определенные положительные моменты.У меня есть несколько программ потоковой обработки, которые загружают отложенные списки через любые различные комбинаторы, которые успешно работают с гигабайтами данных, используя при этом всего 3,5 МБ или около того памяти (из которых более 2 МБ приходится на время выполнения GHC).И кто-то более умный, чем я, указал мне в прошлом году, что вы, как типичный программист на Haskell, были бы очень удивлены, насколько сильно вы зависите от ленивой оценки.

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

Я не думаю, что это что-то новое;Я уверен, что другие языки и архитектуры тоже проходили через это.В конце концов, как первые программисты справлялись со стеками оборудования и всем таким прочим?Держу пари, не так уж хорошо.

Я думаю, что Ян-Уим Массан PH Компилятор был/был строгим. Следующим ближайшим является спекулятивная оценка вилка Роберта Эннала для GHC 5. Форк spec_eval не является строгой, но вместо этого оптимистично оценивает. Я не знаю, являются ли какие -либо из них, все еще текущие/пригодные для использования/и т. Д.

Использование NFDATA и RNF везде не является решением, поскольку это означает, что это означает многократно пересекать большие структуры, которые уже были оценены.

Вступительная глава доктора философии Бена Липпмайера (о DDC) посвящена лучшей критике Хаскелла, которую я видел-в нем обсуждаются проблемы лени, разрушительного обновления, трансформаторов MONAD и т. Д. , и это считается эффектом, который отслеживается и управляется системой типа и эффекта DDC.

Недавно я видел некоторую работу в этой области:

https://ghc.haskell.org/trac/ghc/wiki/strictpragma

Вы можете услышать немного об этом в обновлении статуса GHC SPJ:

http://youtu.be/ex79k4lvjno?t=9m33s(Ссылка начинается с соответствующей статьи в 9:33)

Я ищу компилятор Haskell, который по умолчанию использует строгую оценку вместо ленивой оценки.

Такой компилятор не будет компилятором Haskell. если ты В самом деле хочу, вы можете подумать о том, чтобы положить {-# LANGUAGE Strict #-} Прагмы в ваших файлах. Это будет работать с GHC 8.0.2, 8.2.2 и 8.4.1, он же последние три выпуска компилятора.

Также было бы полезно, если бы был способ использовать ленивую оценку и в определенных местах, на случай, если я хочу что -то вроде бесконечного списка

Там нет такого метода. Вместо этого используйте GHC, как это было предназначено - как ленивый язык. Научиться правильно думать о вашем коде, профиле и функциональных структурах данных будет гораздо более полезным, чем бездумно применение строгих прагм повсюду. У GHC уже есть анализатор строгости.

(Я, наверное, никогда не буду).

Это именно то, что авторы LLVM-HS мысль Когда они решили использовать строгую государственную монаду, а не ленивую. Вместо этого это вызвало неожиданную ошибку в будущем. Лень и рекурсия идут рука об руку.

Пожалуйста, не пытайтесь убедить меня в том, что ленивая оценка лучше, мне действительно нужна производительность.

Я сомневаюсь, что это на самом деле то, что вы хотите, когда он не достоверно повышает производительность кода Haskell, одновременно нарушая существующий код и делая существующие ресурсы бесполезными. Если это то, как вы собираетесь писать программы, просто используйте OCAML или Scala и оставьте сообщество Haskell в покое.

IIRC, Саймон Пейтон Джонс даже сказал, что ленивая оценка не была действительно необходима, она была в основном для того, чтобы не допустить, чтобы язык не вычислил.

Это неправда. Вы можете прочитать больше об реальной истории Хаскелла здесь

Существует также Sequaid, который нацелен на середину спектра ленивых строк.

SEQAID-это плагин GHC, обеспечивающий неинвазивную автоинструментацию проектов Haskell, для контроля динамической строгости (и параллелизма). Вскоре это будет включать оптимизацию для автоматического облегчения утечки пространства с использованием минимальной строгих.

Вы явно решили ценность строгой оценки, но я думаю, что вам не хватает точки использования Haskell. Ленивая оценка Haskell позволяет использовать гораздо более гибкие стратегии оптимизации компилятором/интерпретатором. Принуждая свою строгость, преодолевает оптимизатор. В конце концов, использование чрезмерной строгой оценки никогда не будет столь эффективной, как автоматическая оптимизация. Попробуйте складывающуюся сумму по последовательности чисел в GHCI, а затем без ленивой оценки. Вы можете увидеть разницу совершенно четко - в этом случае ленивая оценка всегда быстрее.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top