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.14.1/docs/users_guide/exts/duplicate_record_fields.html

Spec-Zone.ru

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