Подтвердить что ты не робот

Что это за синтаксис haskell?

Я просто просмотрел следующий синтаксис в куске кода Haskell -

data A = A Int Int | B

m :: A -> Int
m a = case a of
  A{} -> 1
  _ -> 2

Что здесь делает A{}? Соответствует ли {} для любого количества аргументов?

У меня такое ощущение, что это связано с тем, что Haskell записывает синтаксические десугары в кучу функций и регулярный алгебраический тип данных. Это тот случай?

4b9b3361

Ответ 1

Да, A{} соответствует любому значению, сконструированному конструктором A, независимо от того, был ли тип объявлен с синтаксисом записи или нет.

В отчете указано

Выражение F {}, где F является конструктором данных, легально, было ли объявлено F с синтаксисом записи (при условии, что F не имеет строгих полей - см. четвертую марку выше); он обозначает F ⊥1... ⊥n, где n - арность F.

"Четвертая пуля", упомянутая в скобках, гласит, что статическая ошибка заключается в построении значения с синтаксисом записи, который опускает строковое поле.

И в разделе соответствие шаблонов одно из правил грамматики для шаблонов

apat -> qcon { fpat1 , … , fpatk }      (labeled pattern, k ≥ 0)

и семантика приведена в подразделе о формальной семантике сопоставления шаблонов (3.17.3) как

(o) case  v  of {  K  {} ->  e ; _ ->  e′ }
        = case  v  of {
            K _… _ ->  e ; _ ->  e′ }