Spec-Zone.ru › Haskell 9

6.5.5. Поля дублируемых записей

DuplicateRecordFields
Подразумевает:

DisambiguateRecordFields

С:

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

© 2002–2007 The University Court of the University of Glasgow. All rights reserved.
Licensed under the Glasgow Haskell Compiler License.
https://downloads.haskell.org/~ghc/9.12.1/docs/users_guide/exts/duplicate_record_fields.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API