Куча Хаскеля

Автор оригинала: Edward Z. Yang
  • Перевод

Куча Хаскеля — довольно странное место. Она не похожа на кучу в традиционном языке со строгими вычислениями...

… которая представляет из себя кучу мусора из старых добрых простых данных!

В куче Хаскеля всё аккуратно завёрнуто по коробочкам. Куча Хаскеля — это куча подарков (thunks).

Когда вы хотите узнать, что же внутри подарка, вы открываете (вычисляете) его.

Подарки обычно как-то называются, и бывает, открывая подарок, вы получаете подарочный сертификат (конструктор данных). У сертификата две черты: он как-то называется (например, Just или Right), и он рассказывает, где же собственно ваш подарок. А если вы счастливчик, то внутри может оказаться даже несколько подарков (сертификат-кортеж)!


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

Понимание того, что происходит, когда вы открываете подарок — это ключ к пониманию, как программы на Хаскеле тратят память и время.

В этой серии статей Эдвард окунет вас в мир комиксов, чтобы показать основы вычислений в ленивом языке. Я надеюсь, вам понравится!
В следующий раз: Вычисление в куче Хаскеля
Замечание. Строго говоря, эта серия должна называться “Куча GHC”. Но я попытался убрать как можно больше зависимостей от GHC и предлагаю метафору, которая применима к любому ленивому языку. Изначально, серия озаглавливалась “Подрывник изучает ленивые вычисления”, но я припас метафору бомбы для thunks, которые выдают ошибку или зависают. Мне больше нравится метафора подарка, так как она захватывает несколько важных аспектов ленивости: разница между вычисленным/невычисленным и то, что однажды открытый подарок открыт для всех. Использование термина “boxed” немного путает: boxed или lifted значения в GHC как раз могут зависать или выдавать ошибку, в то время, как unboxed значения похожи на то, что вы видите в куче языка C. Однако, языки типа Java также используют boxed для примитивных значений, которые выглядят как объекты. Для ясности, отныне мы не будем использовать термин boxed (и, конечно, не рассматриваем unboxed типы).

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

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

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

Подробнее

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

    +17
    >В куче Хаскеля всё аккуратно завёрнуто по коробочкам. Куча Хаскеля — это куча подарков (thunks). Когда вы хотите узнать, что же внутри подарка, вы открываете (вычисляете) его.
    >Подарки в куче довольно своенравны. Некоторые взрываются, когда вы их открываете, другие населены духами, которые открывают другие подарки, когда их тревожат.
    Ну и где мне теперь скрыться от этого полного, беспросветного п*здеца?
      0
      Что увидено, уже не развидеть
        –2
        Охохо. Автор явно поделиться тем что он там купит :)
          +1
          Прошу прощения. «должен поделиться» *
            +2
            и не купит, а курит)
              0
              Да… уже заметил. С спросонья натыкал не туда :(
        +7
        Это наконец та самая статья для IT-ресурса суть которой никому вне IT-сферы понять не дано?)
          +16
          Я бы даже сказал что суть которой многим в IT-сфере понять не дано.
          0
          Без бутылки вики не разобраться… ru.wikipedia.org/wiki/Haskell
            +2
            Невообразимо круто.
              0
              «Если написать программу, которой сможет пользоваться любой идиот, то только идиоты этой программой и захотят пользоваться»…

              К чему такой детский сад? Между высшей алгеброй и объяснением на пальцах срединного пути нет?
                0
                Я просто приведу цитату:
                «Если вы что-то не можете объяснить 6-летнему ребёнку, вы сами этого не понимаете.»
                — Бернард Шоу
              –2
              Что то чушь какая то )
                0
                даю топикстартеру ещё одну идею, как можно легко и просто рассказывать про хаскель так, чтобы было понятно даже самым глупым и неграмотным. вот, например, смысл «монады» мало кто понимает, даже если и пользовался. хотя на самом деле это довольно просто, ведь монада — это всего-навсего моноид в категории эндофункторов.
                  0
                  А в чём собственно заключается идея?
                    +2
                    Все просто. В языке есть «чистые» функции и «монады». Первые выполняют вычисление на основе аргументов без побочных эффектов. То есть, если f(1,2,3) = 15, то при данных аргументах она ВСЕГДА = 15. В ООП языках это не гарантируется, потому что есть глобальные переменные, члены класса и тд, которые могут меняться. Вот, а монады как раз могут возвращать разные значения в зависимости от аргументов. Обычно, в связи с вызовами функций ввода-вывода. Чистые функции обладают одним интересным свойством, а именно, возможностью автоматического распараллеливания программы, потому что аргументы функций могут вычисляться параллельно без побочных эффектов. В эру многоядерных процессоров это особенно актуально.

                    У функциональных языков есть еще много интересного (взять хотя бы ленивые вычисления). Но, судя по комментариям к этой заметке, что большинству «тру айтишников» на хабре этого не дано понять.
                      0
                      так это чо, получается, что монада — это просто функция, которую надо всё время вычислять, и она заманала генерить непредсказуемое на выходе?
                        0
                        Монада — традиционная «функция» с побочными эффектами, как в c/c++/pascal. Два раза подаешь одинаковые аргументы и не факт, что получишь один результат.
                          +2
                          Да ничего подобного. Монада — это класс с интерфейсом из трёх чистых функций, при помощи которых можно абсрагировать концепцию состояния и побочных эффектов.
                            0
                            Думаете, такое объяснение поможет обратить сторонников ООП в новую веру? :) Главное — что оно делает, а не как оно реализовано.
                              0
                              Зачем вообще кого-то кудато обращать? И вот как раз то, что оно делает — это и есть класс с тремя методами (интерфейс), а то, как оно это делает — это и есть реализация.

                              Но просто монада — это абсолютно точно ни с какой точки зрения не является функцией. Зачем вводить в заблуждение начинающих Haskell-истов? Язык-то и без этого не тривиальный.
                        0
                        Вроде бы тема была раскрыта habrahabr.ru/blogs/Haskell/118167/
                          0
                          Если уж на то пошло, и в ООП языках уже есть и чистые функции, и замыкания и lazy argument evaluation: например, в языке D, и в других тоже вроде есть. Так что больше не надо извращаться с заумными академическими языками, чтобы ими пользоваться.
                            0
                            С академическими языками не обязательно извращаться. Достаточно иногда на них поглядывать, чтобы знать, что появится в промышленных языках через 3-5-10 лет.
                            И время от времени нужно выбрасывать языки на свалку потому, что в них накапливаются исторические слои мусора.
                      0
                      Картинки клёвые, но шо тут написано…
                        +1
                        Вот что случается, когда художники начинают учить программированию.
                          +1
                          Вы так говорите, как будто это что-то плохое :)

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

                          А по поводу художника: learnyouahaskell.com выглядит еще более забавно, хотя его рисовал таки сам автор :)
                            0
                            learnyouahaskell.com выглядит круто! :)
                          +3
                          Эта серия статей явно не для знакомства с языком. И не для мотивации изучения хаскеля.

                          Скорее для тех, кому интересно разобраться в тонкостях работы компилятора.

                          Рисунки хоть и примитивные, но со смыслом:
                          1 — простое значение
                          Just y — тип данных Maybe a
                          тупл — (a,b)
                          _|_ — значение, вычисление которого приведёт к ошибке
                          seq x y — функция форсированного вычисления, нужна чтобы выключить «ленивость»
                            0
                            Именно! Чтобы развить интуицию о том, что за чем, сколько памяти и как долго.

                            У меня ещё ленивые вычисления ассоциируются с фигурно вязаным свитером: тянешь за ниточку, свитер распускается, а ниточка запутанно бегает по петлям.
                              0
                              А по поводу _|_ uncyclopedia говорит:
                              Calculations which are undefined are denoted by the _|_ symbol, pronounced Bottom, which the documentation explains as the compiler giving you the finger.
                              0
                              Я так понимаю, ждать продолжения? Лично я с интересом почитаю!
                                +1
                                Вскорости будет!

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

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