-
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