Читаемость не всегда улучшается удалением as-pattern. Сравнить
foo x@(C a b (D c d) (E e f)) = bar x
с
foo (C a b (D c d) (E e f)) = bar (C a b (D c d) (E e f))
Я думаю, что первый более читабелен.
Кроме того, могут быть некоторые различия в производительности. Насколько я знаю, использование x@(C ...)
и последующая ссылка на x
приведут к тому, что GHC определит x
как указатель на ту же ячейку памяти, содержащую (C ...)
. Вместо этого, используя (C ...)
с теми же аргументами, можно выделить новый «объект», который является копией исходного.
Конечно, GHC может применить своего рода CSE (исключение общего подвыражения), чтобы хранить только копию. Однако, поскольку CSE не всегда выгоден w.r.t. GHC довольно консервативен в использовании CSE.
Прямо сейчас я не вижу никаких проблем в выполнении этой оптимизации в данном конкретном случае, поэтому, возможно, GHC мог бы использовать CSE в конце концов. Тем не менее, я не уверен в этом.