Что это за синтаксис haskell? - PullRequest
28 голосов
/ 18 января 2012

Я только что натолкнулся на следующий синтаксис в фрагменте кода на Haskell -

data A = A Int Int | B

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

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

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

1 Ответ

28 голосов
/ 18 января 2012

Да, 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′ }
...