Вычисление в куче Хаскеля

Автор оригинала: Edward Z. Yang
  • Перевод
Начало серии Куча Хаскеля

Дух новогодних подарков

Сегодня в статье мы кратко рассмотрим, что происходит, когда вы в куче Хаскеля открываете подарок с духом внутри. Почти во всём, что есть в куче, кроме констант и того, что уже вычислено, сидит дух. Весь вопрос в том, что станет делать дух в подарке.

В простейшем случае почти ничего!

В отличие от реальных подарочных сертификатов, вы обязаны забрать подарок (Хаскель не позволит вам вычислить thunk, а потом наплевать на указание, которое находится внутри)

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

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


Однако, дух вдруг без видимой причины может открыть внеочередной подарок...

или выполнить опасное IO действие с побочным эффектом...

Учтите, что, открывая подарки, дух будит других духов:

В результате духи устраивают настоящий шабаш, и всё это, чтобы открыть единственный подарок!

Факт, что открытие одного подарка (thunk) может привести к цепной реакции — и есть причина, почему ленивые вычисления удивляют людей, которые раньше держали все свои объекты в куче уже распакованными (вычисленными). Чтобы удивление прошло, нужно понять, когда дух решит распаковать подарок (анализ строгости/strictness analysis) или может быть ваш подарок уже распакован (анализ амортизации/amortized analysis).

В прошлый раз: Куча Хаскеля
В следующий раз: IO работает с кучей Хаскеля

Похожие публикации

Средняя зарплата в IT

110 000 ₽/мес.
Средняя зарплата по всем IT-специализациям на основании 8 657 анкет, за 2-ое пол. 2020 года Узнать свою зарплату
Реклама
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее

Комментарии 13

    +1
    Неплохая аналогия получается, но картинки радуют еще больше :)

    > В большинстве случаев, духи ленятся и, когда их будят, чтобы ознакомиться с содержимым подарка, сначала открывают другие подарки!
    Это звучит неверно. В оригинале было
    > More commonly, the ghost was lazy and, when woken up, has to open other presents to figure out what was in your present in the first place!

    Не могу сказать как перевести точнее ибо не переводчик, но можно так:
    В большинстве случаев, дух (конкретный дух на предыдущих картинках) ленился (это ленился тут не в тему совсем, но его точно выкидывать нельзя :)) и, когда его разбудят, ему нужно будет сначала открыть другие подарки, чтобы узнать что же было в вашем подарке изначально!
      0
      Немного перефразировал.
      > what was in your present in the first place!
      «Изначально», как ни странно, здесь имеет смысл «в конце» :) результат вычислений.
        0
        угу, мне нравится Ваш конечный вариант :)
        +2
        В большинстве случаев, когда дух разбужен, он вынужден сначала открыть несколько других подарков, чтобы узнать, что же должно быть в вашем, потому что раньше сделать это ему было лень.
          0
          текущий вариант автора мне больше по душе :) Он отлично сочетается по стилю с картинками. Хотя Ваш вариант несомненно лучше моего корявого…
            0
            Когда я писал свой, последнего варианта автора еще не было)
        +2
        Мне кажется нужно спрятать unsafePerformIO подальше и никому не показывать :)
          0
          Отличная серия статей, спасибо автору и переводчику.
          Очень нестандартно и интересно написано о сложных вещах.
          Жду следующих переводов.
            +1
            Читаю только ради картинок :)
              0
              Да, именно картинки сподвигли меня на перевод.
              0
              Я чтото недопонял, почему «без видимой причины может открыть внеочередной подарок...»
              Разве порядок открывания подарков не заложен в самом духе?
                +1
                Функция seq форсирует вычисление значения, позволяет избежать ленивости. Используется для борьбы с «ленивыми» утечками памяти.

                Лучше всего тема применения этой функции раскрыта в Real World Haskell. Там же раскрыта тема оптимизации программ на haskell в типичных случаях.
                0
                Отличные картинки :)

                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                Самое читаемое