Всі ми знаємо (або повинні знати), що Хаскелл ледачий за замовчуванням. Ніщо не оцінюється, поки не повинно бути оцінено. Тож коли треба щось оцінювати? Є моменти, коли Хаскелл повинен бути суворим. Я називаю це "пунктами суворості", хоча цей конкретний термін не настільки поширений, як я думав. За моїми словами:
Зменшення (або оцінка) у Haskell відбувається лише в точках суворості.
Таким чином, питання: які, саме , є точками Строгість Хаскеля? Моя інтуїція говорить , що main
, seq
/ чубчик модель, зіставлення з зразком, і будь-який IO
дію , що здійснюється з допомогою main
є первинними точками Строгості, але я не знаю , чому я це знаю.
(Крім того , якщо вони не називаються «точка строгості», що є вони називаються?)
Думаю, хороша відповідь включатиме дискусію про WHNF тощо. Я також уявляю, що це може торкнутися лямбда-числення.
Редагувати: додаткові думки щодо цього питання.
Коли я роздумував над цим питанням, я думаю, було б зрозуміліше додати щось до визначення пункту суворості. Точки суворості можуть мати різний контекст та різну глибину (або строгість). Повертаючись до мого визначення, що "скорочення Хаскелла відбувається лише в точках суворості", додамо до цього визначення цей пункт: "точка суворості спрацьовує лише тоді, коли навколишній контекст оцінюється або зменшується".
Отже, дозвольте мені спробувати, щоб ви почали з тієї відповіді, яку я хочу. main
є пунктом суворості. Він спеціально призначений як основний пункт суворості його контексту: програма. Коли main
оцінюється програма ( контекст), активується пункт строгості main. Глибина основи максимальна: вона повинна бути повністю оцінена. Основне зазвичай складається з дій вводу-виводу, які також є пунктами суворості, контекст яких і є main
.
Тепер ви спробуєте: обговорити seq
та узгодження шаблонів у цих термінах. Поясніть нюанси застосування функції: наскільки вона сувора? Як це ні? Що про deepseq
? let
і case
заяви? unsafePerformIO
? Debug.Trace
? Визначення верхнього рівня? Строгі типи даних? Візерунки вибуху? І т. Д. Скільки з цих елементів можна описати з точки зору просто наступних чи збігів шаблонів?
seq
і узгодження зразків є достатніми, а решта визначається з точки зору цих. Я думаю, що узгодження шаблонів забезпечуєIO
, наприклад, суворість дій у хребті .