Haskell, почему с помощью @ (как) - PullRequest
2 голосов
/ 22 марта 2019

наткнулся на этот пример:

buildEntry ws@(w:_) = (w, length ws)

В чем преимущество использования ws@(w:_) вместо:

buildEntry' (w:ws) = (w, length (w:ws))

Поскольку я только начинающий, я думаю, что читаемость второго примера также лучше.

1 Ответ

5 голосов
/ 22 марта 2019

Читаемость не всегда улучшается удалением 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 в конце концов. Тем не менее, я не уверен в этом.

...