[personal profile] iamjaph
После N-ной провальной попытки изучить Haskell и понять суть религии под названием "монадический фетишизм", решил изобрести свой "велосипед", то есть чистый и ленивый язык программирования.

Для любой открытой системы важным моментов является взаимодействие с внешним миром. В данном случаем - порядок обмена информацией.

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

Одним из способов упорядочивания вычислений является ввод дополнительных переменных-маркеров, при помощи которых указываются дополнительные зависимости между подпрограммами. Например, подпрограмма "C" зависит от переменной "b", которая определяется в подпрограмме "B", в свою очередь подпрограмма "B" зависит от переменной "a", значение которой определяется в подпрограмме "A", что приводит к выполнению сначала подпрограммы "A", затем "B" и лишь затем "C". Эти переменные маркеры в Mozart-OZ получили название свободные (unbound) переменные, а в Clean - уникальные типы.

Другим способом упорядочивание вычислений является использование стиля передачи продолжений. Однако этот стиль труден для использования им требует модификации подпрограмм. К счастью последнего можно избежать при помощи подпрограммы-обертки. В Haskell этой оберткой является оператор bind, а монады по сути не что иное, как своеобразный "концептуальный сахар" над стилем передачи продолжений. В свою очередь Haskell оператор do является "синтаксическим сахаром" вокруг монад, создающих иллюзию того, что переменные меняют свое значение.

Так что на самом деле Haskell, как и Clean, - абсолютно чистый язык, а религия "монадический фетишизм" - удел тех, кто на видеть разницы между иллюзией и реальностью.

P.S.
Во загнул! С другой стороны, что взять с простого физ-химика, волей случая написавшего несколько маленьких программ на Perl.
From: [identity profile] iamjaph.livejournal.com
1) Ой, это я в примере ошибся. Список использовался в двух местах...

2) Имел ввиду, борьбу с ленивостью. Стоит ли использовать ленивость, а где надо бороться с ней.
Или энергичность,а где надо делать ленивость. Выгода по простоте использования.

Борьба с ленивостью

Date: 2010-12-15 09:24 am (UTC)
From: [identity profile] nponeccop.livejournal.com
Тут важно понимать, что ленивые чистые языки чище жадных (т.е теория эквивалентных преобразований, еquational theory, проще), и тотальные языки чище нетотальных.

Тотальные языки всем хороши, но, несмотря на абсолютную чистоту, не дают покоя пуристам тем, что необходимо Тьюринг-неполны.

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

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

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

Насчёт нетотальных ленивых и нетотальных энергичных - зависит от приложения. Компилятор (где зависимости по данным сложны) и веб-сайт васи пупкина (где производительность не важна) лучше писать на ленивом, а приложения, в которых разбухание памяти критично - на энергичном.

Детально - надо читать монографии об оценке пространственной и временной сложности ленивых программ. В целом, при ленивости чаще приходится пользоваться профайлером, а при энергичности - чаще писать код через жопу.

Re: Борьба с ленивостью

Date: 2011-01-31 09:35 am (UTC)
From: [identity profile] iamjaph.livejournal.com
Что-то грустно стало. Оказалось, что haskell намного проще, чем о нем говорят.
Изучения его для меня сводиться к болезненным расставанием с заблуждениями, полученными от чтение попадающихся на глаза различных статей и заметок о нем. Столько времени потратил на разные "слухи и сплетни". Надо себе где-то написать большими буквами: "ЧИТАЙ ПЕРВОИСТОЧНИКИ!!!"

Спасибо, вам, за хорошие ссылки.

А что такое тотальные языки - никак не могу нагуглить.

Profile

iamjaph

March 2025

S M T W T F S
      1
2345678
9101112131415
16171819 202122
23242526272829
3031     

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Oct. 8th, 2025 02:23 pm
Powered by Dreamwidth Studios