-
RecordWildCards -
- Подразумевает:
- Начиная с версии:
-
6.8.1
Разрешает использовать подстановочные шаблоны при создании записей и сопоставлении с образцом.
Подстановочные шаблоны записей включаются языковым расширением RecordWildCards. Это расширение подразумевает DisambiguateRecordFields.
Для записей с большим количеством полей утомительно указывать каждое поле отдельно в образце записи, например:
data C = C {a :: Int, b :: Int, c :: Int, d :: Int}
f (C {a = 1, b = b, c = c, d = d}) = b + c + d
Синтаксис подстановочных шаблонов записей позволяет использовать «..» в образце записи, при этом каждое пропущенное поле f заменяется образцом f = f. Например, приведённый выше образец можно записать так:
f (C {a = 1, ..}) = b + c + d
Подробнее:
-
Подстановочные шаблоны записей в образцах можно сочетать с другими образцами, включая сокращённую запись полей (Сокращённая запись полей); например, в образце
(C {a = 1, b, ..}). Кроме того, подстановочные шаблоны записей можно использовать везде, где встречаются образцы записей, в том числе в привязкахletи на верхнем уровне. Например, привязка верхнего уровняC {a = 1, ..} = eопределяет
b,cиd. -
Подстановочные шаблоны записей также можно использовать в выражении при создании записи. Например:
let {a = 1; b = 2; c = 3; d = 4} in C {..}вместо
let {a = 1; b = 2; c = 3; d = 4} in C {a=a, b=b, c=c, d=d}Расширение выполняется исключительно синтаксически, поэтому выражение с подстановочным шаблоном записи ссылается на ближайшие охватывающие переменные, имена которых совпадают с именами пропущенных полей.
-
Для подстановочных шаблонов как в образцах, так и в выражениях «
..» раскрывается в отсутствующие поля записи, находящиеся в области видимости. В частности, «C {..}» включаетfтогда и только тогда, когда:-
fявляется полем записи конструктораC. - Поле записи
fнаходится в области видимости (с квалификатором или без него).
Эти правила ограничивают применение подстановочных шаблонов записей ситуациями, в которых пользователь мог бы написать раскрытый вариант. Например:
module M where data R = R { a,b,c :: Int } module X where import M( R(R,a,c) ) f a b = R { .. }Шаблон
R{..}раскрывается вR{a=a}; полеbпропускается, поскольку поле записи не находится в области видимости, аcпропускается, поскольку переменнаяcне находится в области видимости (если не считать привязку селектора записиc, разумеется). -
-
При использовании подстановочных шаблонов записей для создания записи поле
fинициализируется только в том случае, еслиfнаходится в области видимости и не было импортировано или привязано на верхнем уровне. Например,fможет быть привязано сопоставлением с образцом во внешней области или привязкой let/where. Например:module M where import A( a ) data R = R { a,b,c,d :: Int } c = 3 :: Int f b = R { .. } -- Expands to R { b = b, d = d } where d = b+1Здесь
aимпортировано, аcпривязано на верхнем уровне, поэтому ни одно из них не включается в раскрытие «..». Это сделано для того, чтобы читателю было легко понять, во что раскрывается «..». -
Подстановочные шаблоны записей нельзя использовать (а) в конструкции обновления записи и (б) для конструкторов данных, объявленных без полей записи. Например:
f x = x { v=True, .. } -- Illegal (a) data T = MkT Int Bool g = MkT { .. } -- Illegal (b) h (MkT { .. }) = True -- Illegal (b)