Мы все знаем (или должны знать), что по умолчанию Haskell ленив. Ничто не оценивается, пока оно не будет оценено. Итак, когда нужно что-то оценивать? Есть точки, где Хаскелл должен быть строгим. Я называю эти "точки строгости", хотя этот конкретный термин не так широко распространен, как я думал. По мне:
Сокращение (или оценка) в Haskell происходит только в точках строгости.
Итак, вопрос: , что именно, являются точками строгости Хаскелла?. Моя интуиция говорит, что main
, seq
/bang-шаблоны, сопоставление образцов и любое действие IO
, выполняемое через main
являются основными точками строгости, но я действительно не знаю, почему я это знаю.
(Кроме того, если они не называются "точками строгости", что они называются?)
Я полагаю, что хороший ответ будет включать в себя некоторые дискуссии о WHNF и так далее. Я также предполагаю, что он может касаться лямбда-исчисления.
Изменить: дополнительные мысли по этому вопросу.
Как я уже размышлял по этому вопросу, я думаю, что было бы лучше добавить что-то к определению точки строгости. Точки строгости могут иметь различные контексты и различную глубину (или строгость). Возвращаясь к моему определению, что "сокращение Haskell происходит только в точках строгости", добавим к этому определению этот раздел: "Точка строгости срабатывает только тогда, когда ее окружающий контекст оценивается или уменьшается".
Итак, позвольте мне попытаться начать с того типа ответа, который я хочу. main
- точка строгости. Он специально обозначается как основная точка строгости его контекста: программа. Когда оценивается программа (main
контекст), активируется точка строгости main. Основная глубина максимальна: она должна быть полностью оценена. Основной обычно состоит из операций ввода-вывода, которые также являются точками строгости, контекст которых main
.
Теперь попробуйте: обсудите seq
и сопоставление шаблонов в этих условиях. Объясните нюансы применения функций: как это строго? Как это не так? Что насчет deepseq
? let
и case
заявления? unsafePerformIO
? Debug.Trace
? Определения верхнего уровня? Строгие типы данных? Модели взлома? И т.д. Сколько из этих элементов можно описать с точки зрения просто seq или соответствия шаблонов?