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

Spec-Zone.ru

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