metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2012-07-02 01:18 pm

Функциональный апартеид

http://udpn.livejournal.com/78084.html?style=mine
Обычно говорят, что нормальный порядок редукции нужен для того, чтобы bottom в аргументе не превращался в bottom в результате всегда, когда это возможно. Само по себе это никому не нужно. Дело именно в отложенном вычислении аргументов. Чтобы определить управляющие конструкции в языке с аппл. порядком редукции, нужно это делать явно, и их можно ввести только конечное число на этапе разработки языка. С нормальным порядком мы имеем возможность определять новые конструкции в любом количестве.

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

[identity profile] falcrum.livejournal.com 2012-07-02 10:28 am (UTC)(link)
Хм-м, все, кто не пользуют функциональное программирование - индусы? Однако... :)

[identity profile] nicka-startcev.livejournal.com 2012-07-02 10:36 am (UTC)(link)
это фашизм!
Я, честный труженик села с полным ртом полными руками навоза, протестую!

[identity profile] metaclass.livejournal.com 2012-07-02 10:48 am (UTC)(link)
Использовать не обязательно, но представлять разницу полезно.
http://xoposhiy.livejournal.com/88565.html

Ключевой момент - возможность расширять/реализовывать некоторые конструкции, не меняя компилятор языка - без этого начинается всякий закат солнца вручную.

Впрочем, иногда бывает так, что вроде как бы и можно все делать, но выглядит это при реализации так, что лучше бы этого не было :)

[identity profile] molnij.livejournal.com 2012-07-02 11:11 am (UTC)(link)
Вы бы хоть уточняли что людей определенной профессии, а то многие могут посмотреть с недоумением

[identity profile] si14.livejournal.com 2012-07-02 11:13 am (UTC)(link)
Спорно. Не во всех функциональных языках нормальный порядок редукции (скорее даже в большинстве аппликативный). Scala, Clojure, Erlang, Ocaml — не функциональные языки?

[identity profile] justy-tylor.livejournal.com 2012-07-02 11:18 am (UTC)(link)
Ой, какая древняя зефировщина... :) Управляющие конструкции при ленивости вводятся лишь до определённого предела. Очередной комбинатор !@!@#$% - легко. Что-то уровня do notation - никак. Но, как гласят легенды, истинному программисту на Хаскеле и не должно хотеться лучшего.

[identity profile] nivanych.livejournal.com 2012-07-02 11:23 am (UTC)(link)
С ленивостью одна большая проблема — это полный пофигизм по отношению к ресурсной семантике.
И даже в современных языках, все эти проблемы решаются ad hoc.
Вроде как, имеешь опыт работы с ленивостью — должен сообразить.
А не сообразил, и ВНЕЗАПНО, где-то-там у тебя прорвало — сам виноват.
Рассуждения о ресурсной семантике (не без помощи линейной логики!) нормализации в ламбда-исчислении приводят к оптимальной редукции, о которой немало писал [livejournal.com profile] codedot. Хоть он всё делает для бестиповой лямбды, но и такое изучить небесполезно.

[identity profile] aamonster.livejournal.com 2012-07-02 11:25 am (UTC)(link)
А что, это не одно и то же?

[identity profile] metaclass.livejournal.com 2012-07-02 11:26 am (UTC)(link)
Хм, оптимальный порядок редукции это интересно. Это ж будет "странная" комбинация аппликативного и нормального, которую мы сейчас обычно закатываем солнцем вручную.

[identity profile] gds.livejournal.com 2012-07-02 11:28 am (UTC)(link)
+1. А вот в Coq, где синтаксис расширяется отнюдь не через подобные функции, а через более правильный механизм Notations, вполне делается do-нотация.
И в окамле подобное решается без лентяйки -- достаточно написать camlp4-расширение (или, с новым подходом, который уже в транке, но ещё не в релизе, всего лишь функцию на 20 строк, что ещё проще).

[identity profile] nivanych.livejournal.com 2012-07-02 11:29 am (UTC)(link)
Что именно одно и тоже?...

[identity profile] nivanych.livejournal.com 2012-07-02 11:30 am (UTC)(link)
Дворники, например.
Я думаю, ребе М тут со мной согласен.

[identity profile] nivanych.livejournal.com 2012-07-02 11:39 am (UTC)(link)
Нуу, можно считать это комбинацией аппликативного и нормального, скорее всего (полностью не уверен).
Но сколько я видел, это рассматривают с другой стороны.

[identity profile] jakobz.livejournal.com 2012-07-02 11:43 am (UTC)(link)
Обычно говорят что нормальный порядок нужен для <общее определение>, но на деле оно для <частный случай>

[identity profile] jakobz.livejournal.com 2012-07-02 11:45 am (UTC)(link)
Это, кстати, в SICP разбирается в первой главе, в примере где типа "Маша-дурняша хочет захуярить if, почему она соснет".

[identity profile] aamonster.livejournal.com 2012-07-02 11:49 am (UTC)(link)
"чтобы bottom в аргументе не превращался в bottom в результате всегда, когда это возможно", "отложенное вычисление аргументов" и возможность "определить управляющие конструкции"?

Ну, если вдаваться в тонкости - то разное (например, в Форте нет ленивости - но новые управляющие конструкции определяются свободно), но в контексте ФП...

[identity profile] udpn.livejournal.com 2012-07-02 11:49 am (UTC)(link)
Вот, суть уже пробивается.

[identity profile] si14.livejournal.com 2012-07-02 11:51 am (UTC)(link)
Это вы к тому, что не являются? Достаточно спорно.

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

[identity profile] udpn.livejournal.com 2012-07-02 11:53 am (UTC)(link)
Mixfix-нотация это, конечно, хорошо, только это не макросы, а просто другая запись функций, так что аргументы всё равно будут вычисляться до того, как мы узнаем, нужны ли они нам вообще. Поэтому нужно и то, и другое.

[identity profile] udpn.livejournal.com 2012-07-02 11:57 am (UTC)(link)
Кстати да, всегда интересно было, о чём пишет codedot, но пишет он очень сложно.

Под "оптимальностью" подразумевается минимальное количество вычислений согласно некоторому определению этого "количества"? Просто я не вижу причин уходить дальше редукции на графах, а они, судя по всему, есть (затраты памяти или на косвенность, не знаю).

[identity profile] udpn.livejournal.com 2012-07-02 12:01 pm (UTC)(link)
Неправда. Вот я могу зависимыми типами и проверкой тотальности вообще убрать bottom из языка. В чём тогда будет разница между нормальным и аппликативным порядками? А она будет. В одном случае аргументы if_then_else_ будут вычисляться все, а в другом — только нужные. Если не ошибаюсь, это называется как раз "операционной семантикой."

[identity profile] udpn.livejournal.com 2012-07-02 12:02 pm (UTC)(link)
Что "это"?

[identity profile] jakobz.livejournal.com 2012-07-02 12:04 pm (UTC)(link)
Возможность написания своих управляющих конструкций на ленивом языке.

[identity profile] gds.livejournal.com 2012-07-02 12:13 pm (UTC)(link)
нет, это не просто другая запись функций. (иначе как бы я сделал do-нотацию? там же явно требуется "a <- b" транслировать в "b >>= fun a -> ...")
Ну и вот, чтобы не быть голословным, покажу няшечьку: http://paste.in.ua/4459/ -- судя по коду, который экстрактится в окамл, вычисляется только одно из выражений.

[identity profile] jakobz.livejournal.com 2012-07-02 12:27 pm (UTC)(link)
Да, пожалуй ты прав, именно bottom тут не причем. Хотя убрать его совсем не выйдет, проблема остановки же есть.

Но управляющие конструкции - тоже только один из углов более хитрой проблемы.

Page 1 of 3