-
DuplicateRecordFields -
- Следует из:
- Начиная с версии:
-
8.0.1
Разрешает определять типы записей с полями, имеющими одинаковые имена.
В дополнение к DisambiguateRecordFields (см. Разрешение неоднозначности полей записей) расширение DuplicateRecordFields позволяет объявлять в одном модуле несколько типов данных с одинаковыми именами полей. Например, оно позволяет написать следующее:
module M where
data S = MkS { x :: Int }
data T = MkT { x :: Bool }
Поскольку при использовании полей всегда можно определить, какое именно поле имеется в виду, если указан конструктор, такие случаи, как создание значений и сопоставление с образцом, могут свободно использовать повторяющиеся имена полей. Например, разрешены следующие варианты (как и при использовании DisambiguateRecordFields):
s = MkS { x = 3 }
f (MkT { x = b }) = b
Хотя расширение DuplicateRecordFields разрешает несколько полей с одним и тем же именем в одном модуле, оно не разрешает использовать одно имя для поля и обычного связывания значения. Для этого используйте NoFieldSelectors.
Начиная с GHC 9.4.1, имена селекторов должны быть полностью однозначными (согласно обычным правилам разрешения имён), а для обновления записей должен существовать не более чем один тип данных, содержащий все обновляемые поля.
6.5.5.1. Импорт и экспорт полей записей
Если включено расширение DuplicateRecordFields, неоднозначное поле необходимо экспортировать как часть его типа данных, а не на верхнем уровне. Например, следующий вариант допустим:
module M
( S(x)
, T(..)
) where
data S = MkS { x :: Int }
data T = MkT { x :: Bool }
Однако такой вариант не допускается, поскольку x неоднозначен:
module M (x) where ...
В операторах import можно импортировать несколько полей с одинаковым именем, а также импортировать отдельные поля как часть соответствующих типов данных. Например, допустимы следующие варианты импорта:
import M (S(x)) -- imports the type S and the 'x' field of S (but not the field of T) import M (x) -- imports both 'x' fields import M hiding (S(x)) -- imports everything except the type S and its 'x' field import M hiding (x) -- imports everything except the two 'x' fields