Сопоставление шаблонов Haskell часто является строгим по голове, например, f (x:xs) = ...
требует, чтобы входной список оценивался как (thunk : thunk). Но иногда такое вычисление не нужно и функция может позволить себе быть нестрогой по некоторым аргументам, например f (x:xs) = 3
.
В идеале в таких ситуациях мы могли бы избежать оценки аргументов, чтобы получить поведение const 3
, что можно было бы сделать с помощью неопровержимого шаблона: f ~(x:xs) = 3
. Это дает нам преимущества в производительности и большую устойчивость к ошибкам.
Мой вопрос: реализует ли уже GHC такие преобразования с помощью какого-то анализа строгости? Благодарю, если вы могли бы также указать мне на некоторые чтения на нем.