В чем заключаются точки строгости Haskell?

Мы все знаем (или должны знать), что Haskell по умолчанию ленив. Ничего не оценивается, пока его не нужно оценивать. Итак, когда нужно что-то оценивать? Есть моменты, в которых Haskell должен быть строгим. Я называю это «пунктами строгости», хотя этот конкретный термин не так широко распространен, как я думал. По моему мнению:

Редукция (или оценка) в Haskell только происходит в точках строгости.

Итак, вопрос: что, именно , являются точками строгости Haskell? Моя интуиция подсказывает, что main , seq / bang шаблоны, сопоставление с образцом и любое действие IO , выполняемое через main , являются основными точками строгости, но я действительно не знаю, почему я это знаю.

(Кроме того, если они не называются «точками строгости», как они называются?)

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


Edit: дополнительные мысли по этому вопросу.

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

Итак, позвольте мне Попытайтесь начать с того ответа, который я хочу. main - точка строгости. Он специально обозначен как основная точка строгости своего контекста: программа. Когда программа (контекст main ) оценивается, активируется точка строгости main. Глубина Main максимальна: ее нужно полностью оценить. Main обычно состоит из действий ввода-вывода, которые также являются точками строгости, контекст которых является main .

Теперь вы попробуете: обсудить seq и сопоставление с образцом в этих терминах. Разъясните нюансы применения функции: насколько строго? Как это не так? А как насчет deepseq ? let и case утверждения? unsafePerformIO ? Debug.Trace ? Определения верхнего уровня? Строгие типы данных? Узоры взрыва? И т. Д. Сколько из этих элементов можно описать в терминах последовательности или сопоставления с образцом?

88
задан Dan Burton 5 February 2012 в 00:34
поделиться