>В куче Хаскеля всё аккуратно завёрнуто по коробочкам. Куча Хаскеля — это куча подарков (thunks). Когда вы хотите узнать, что же внутри подарка, вы открываете (вычисляете) его.
>Подарки в куче довольно своенравны. Некоторые взрываются, когда вы их открываете, другие населены духами, которые открывают другие подарки, когда их тревожат.
Ну и где мне теперь скрыться от этого полного, беспросветного п*здеца?
даю топикстартеру ещё одну идею, как можно легко и просто рассказывать про хаскель так, чтобы было понятно даже самым глупым и неграмотным. вот, например, смысл «монады» мало кто понимает, даже если и пользовался. хотя на самом деле это довольно просто, ведь монада — это всего-навсего моноид в категории эндофункторов.
Все просто. В языке есть «чистые» функции и «монады». Первые выполняют вычисление на основе аргументов без побочных эффектов. То есть, если f(1,2,3) = 15, то при данных аргументах она ВСЕГДА = 15. В ООП языках это не гарантируется, потому что есть глобальные переменные, члены класса и тд, которые могут меняться. Вот, а монады как раз могут возвращать разные значения в зависимости от аргументов. Обычно, в связи с вызовами функций ввода-вывода. Чистые функции обладают одним интересным свойством, а именно, возможностью автоматического распараллеливания программы, потому что аргументы функций могут вычисляться параллельно без побочных эффектов. В эру многоядерных процессоров это особенно актуально.
У функциональных языков есть еще много интересного (взять хотя бы ленивые вычисления). Но, судя по комментариям к этой заметке, что большинству «тру айтишников» на хабре этого не дано понять.
Монада — традиционная «функция» с побочными эффектами, как в c/c++/pascal. Два раза подаешь одинаковые аргументы и не факт, что получишь один результат.
Да ничего подобного. Монада — это класс с интерфейсом из трёх чистых функций, при помощи которых можно абсрагировать концепцию состояния и побочных эффектов.
Зачем вообще кого-то кудато обращать? И вот как раз то, что оно делает — это и есть класс с тремя методами (интерфейс), а то, как оно это делает — это и есть реализация.
Но просто монада — это абсолютно точно ни с какой точки зрения не является функцией. Зачем вводить в заблуждение начинающих Haskell-истов? Язык-то и без этого не тривиальный.
Если уж на то пошло, и в ООП языках уже есть и чистые функции, и замыкания и lazy argument evaluation: например, в языке D, и в других тоже вроде есть. Так что больше не надо извращаться с заумными академическими языками, чтобы ими пользоваться.
С академическими языками не обязательно извращаться. Достаточно иногда на них поглядывать, чтобы знать, что появится в промышленных языках через 3-5-10 лет.
И время от времени нужно выбрасывать языки на свалку потому, что в них накапливаются исторические слои мусора.
Просто сама тема довольно нетривиальная, поэтому иллюстрируй ее или нет, сильно понятнее не станет. Тем не менее, хорошо иллюстрированная статья помогает связывать понятия еще и на ассоциативном поле изображений.
А по поводу художника: learnyouahaskell.com выглядит еще более забавно, хотя его рисовал таки сам автор :)
Эта серия статей явно не для знакомства с языком. И не для мотивации изучения хаскеля.
Скорее для тех, кому интересно разобраться в тонкостях работы компилятора.
Рисунки хоть и примитивные, но со смыслом:
1 — простое значение
Just y — тип данных Maybe a
тупл — (a,b)
_|_ — значение, вычисление которого приведёт к ошибке
seq x y — функция форсированного вычисления, нужна чтобы выключить «ленивость»
А по поводу _|_ uncyclopedia говорит:
Calculations which are undefined are denoted by the _|_ symbol, pronounced Bottom, which the documentation explains as the compiler giving you the finger.
Куча Хаскеля