Pull to refresh

Куча Хаскеля

Reading time 2 min
Views 1.7K
Original author: Edward Z. Yang

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

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

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

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

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


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

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

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

Articles