Почему в Haskell есть нестрогие функции (семантика)?

Согласно этой статье о денотационной семантике в haskell, все типы имеют дно и функцию f:A ->B является строгим, если он отображает нижнюю часть типа A в нижнюю часть типа B, в противном случае он называется нестрогим.

(Это напоминает точечную категорию, в которой морфизмы сохраняют базисную точку).

Почему в Haskell есть нестрогие функции, а в Standard ML — нет?


person Mozibur Ullah    schedule 10.01.2013    source источник
comment
Вы спрашиваете, почему лень является частью Haskell в частности или почему она является частью языков программирования вообще?   -  person Heatsink    schedule 10.01.2013
comment
Если вы спрашиваете, в частности, о Haskell, у него есть нестрогие функции, потому что они есть в других языках. Haskell был создан для унификации функций существующих ленивых языков. См. раздел 2.1 исследования . microsoft.com/en-us/um/people/simonpj/papers/ .   -  person Heatsink    schedule 10.01.2013
comment
@heatsink: с языками программирования в целом. Я понял, что нестрогость связана с ленью, но не понимаю, почему.   -  person Mozibur Ullah    schedule 10.01.2013
comment
Я не думаю, что «почему в X есть Y» или «почему в X нет Y» — хорошие вопросы для этого сайта. Почему Java назван в честь острова, почему языковая команда go считает, что исключения не нужны, и в чем проблема с тем, что Firefox не является многопроцессорным браузером? На самом деле это не проблемы программирования, которые должен решать stackoverflow.   -  person scravy    schedule 10.01.2013
comment
foldl и foldr — хороший кандидат на ваш вопрос. foldleft можно определить через foldright, но не наоборот, поскольку foldleft является строгим в конце аргумента списка, а foldright — нет (т. е. fold_left, действующий снизу, дает основание)   -  person zurgl    schedule 10.01.2013


Ответы (4)


Каждый язык программирования с рекурсией имеет по крайней мере одну нестрогую функцию, часто в форме условного оператора (if-then-else). В противном случае все рекурсии обозначали бы дно (не завершение). Однако, как ни важны нестрогие функции, большинство этих языков не позволяют вам определять свои собственные! Некоторые языки компенсируют это ограничение, предлагая макросы — несколько функциональный механизм, который преобразует синтаксис вместо значений.

person Conal    schedule 10.01.2013

Почему в Haskell есть нестрогие функции, а в Standard ML — нет?

В Haskell есть нестрогие функции — обычно ленивые — потому что это полезная функция программирования.

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

person Don Stewart    schedule 10.01.2013
comment
Я согласен, что ленивые функции полезны. Но как допускает это определенная в вопросе строгость? - person Mozibur Ullah; 10.01.2013
comment
Ваш вопрос необходимо уточнить - вы спрашиваете, почему строгость сопоставляет нижнее значение аргумента с нижним значением результата? (т. е. передача undefined в качестве аргумента функции приводит к undefined в строгой функции). - person Don Stewart; 10.01.2013
comment
возможно, слово «строгий» используется здесь не только для одного понятия. В денотативной семантике это в точности эквивалентно сохранению дна. Принимая во внимание, что я думаю, что вы используете «строгий» для обозначения неленивых функций. Я изменю вопрос, чтобы отразить это. - person Mozibur Ullah; 10.01.2013
comment
Ах я вижу. Ленивость — это один из способов реализации нестрогой семантики. - person Don Stewart; 10.01.2013

Саймон Пейтон-Джонс дал несколько хороших ответов на это в своем наборе слайдов, Власяница.

Лень очень удобна

Рекурсивные значения очень полезны

Лень заставляет вас быть честными [относительно чистоты]

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

Каждый язык вызова по значению дал сигнал сирене о побочных эффектах

Программисты хотят писать C-подобный код, который, я думаю, является зовом сирены, завлекающим большинство языков. В Haskell чередование эффектов волей-неволей просто не имеет смысла, потому что нестрогость означает, что вы не будете уверены, когда эффект будет выполнен.

person Dan Burton    schedule 10.01.2013

Почему в Haskell есть нестрогие функции, а в Standard ML — нет?

Потому что выражение в haskell оценивается в нормальной форме Weak Head, тогда как выражение в стандартном ML оценивается в нормальной форме.

Затем в Haskell вы можете рассуждать, используя необработанный преобразователь, чего в Standard ML вы не можете.
Но вы должны знать, что в Standard ML можно добавить лень. (вы можете сделать это, например, в ocaml)

Ленивость по умолчанию в haskell — это выбор дизайна, возможно, отражающий веру в то, что создание компилятора, который имеет дело с ленивостью по умолчанию, может улучшить понимание функционального программирования, позволяя исследовательскому сообществу сделать один шаг вперед.

person zurgl    schedule 10.01.2013
comment
Потому что выражения в haskell оцениваются в нормальной форме Weak Head .... Я бы сказал наоборот: оценка WHNF предназначена для поддержки нестрогих функций. - person Conal; 10.01.2013