Nano Hash - криптовалюты, майнинг, программирование

Автоматическая вставка лени в Haskell

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

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

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


  • Я не знаю наверняка, но я уверен, что он не пытается это сделать. Неопровержимые закономерности существуют не просто так. эта причина заключается в предполагаемой разнице в семантике между двумя показанными вами определениями, как вы их описали. Анализ строгости AFAIK направлен на уменьшение лени и выполнение неизбежных вычислений раньше, если можно доказать, что это не изменит семантику. Но это только догадки и впечатления, которые у меня есть. Возможно, внимательное прочтение Отчета даст более точные ответы. 15.09.2018
  • Если мы доведем это рассуждение до крайности, мы также должны оптимизировать seq x y до y, что противоречит цели seq. Строгий шаблон, в принципе, мог бы использоваться как частный случай seq. 15.09.2018
  • Символ ~ изменяет семантику функции, поэтому ghc этого не делает. 16.09.2018

Ответы:


1

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

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

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

to

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

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

15.09.2018
  • Стоит отметить, что предлагаемое изменение в исходном вопросе действительно меняет семантику в отношении лени — оно удаляет некоторые возможные основания. Иногда вам нужен очень точный контроль над тем, какие основания могут быть получены из кода, и компилятору, переключающему это на вас, неудобно. 15.09.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..