Spec-Zone.ru › Haskell 9

6.5.8. Подстановочные знаки записей

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

DisambiguateRecordFields.

С:

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)
    

© 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/record_wildcards.html

Spec-Zone.ru

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