-
NamedFieldPuns -
Разрешает сокращённую запись полей.
Сокращённая запись полей включается языковым расширением NamedFieldPuns.
При работе с записями часто пишут шаблон, в котором переменной присваивается то же имя, что и полю записи, например:
data C = C {a :: Int}
f (C {a = a}) = a
Сокращённая запись полей позволяет опустить имя переменной, так что можно просто написать
f (C {a}) = a
и получить тот же шаблон, что и выше. Иными словами, в шаблоне записи шаблон a раскрывается в шаблон a = a для того же имени a.
Обратите внимание:
-
Сокращённую запись полей можно использовать и в выражении, например, написав
let a = 1 in C {a}вместо
let a = 1 in C {a = a}Раскрытие выполняется исключительно на синтаксическом уровне, поэтому раскрытое выражение в правой части ссылается на ближайшую охватывающую переменную с тем же написанием, что и имя поля.
-
Сокращённую запись полей можно сочетать с другими шаблонами в одной записи:
data C = C {a :: Int, b :: Int} f (C {a, b = 4}) = a - Сокращённую запись полей можно использовать везде, где встречаются шаблоны записей (например, в связываниях
letили на верхнем уровне). -
Сокращённая запись для квалифицированного имени поля раскрывается путём удаления квалификатора модуля. Например:
f (C {M.a}) = aозначает
f (M.C {M.a = a}) = a(Это удобно, если селектор поля
aдля конструктораM.Cдоступен только в квалифицированной форме.)