Мы все знаем (или должны знать), что 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
? Определения верхнего уровня? Строгие типы данных? Узоры взрыва? И т. Д. Сколько из этих элементов можно описать в терминах последовательности или сопоставления с образцом?