2012-01-18 14 views
28

Ho appena eseguito attraverso la seguente sintassi in un pezzo di codice Haskell -Cos'è questa sintassi haskell?

data A = A Int Int | B 

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

Qual è il A{} fa qui? Lo {} corrisponde automaticamente a un numero qualsiasi di argomenti?

Ho la sensazione che questo sta sfruttando il fatto che la sintassi record di Haskell desugars a un gruppo di funzioni e un regolare algebrica tipo di dati. È questo il caso?

+5

imparare qualcosa di nuovo ogni giorno, e sono stato di programmazione Haskell per 5 anni; mai visto la sintassi nella mia vita. –

risposta

28

Sì, A{} corrisponde a qualsiasi valore costruito con il costruttore A, indipendentemente dal fatto che il tipo sia stato dichiarato con sintassi di registrazione o meno.

Il language report specifica

L'espressione F {}, dove F è un costruttore di dati, è legale o meno F è stata dichiarata con la sintassi di record (a condizione F non ha campi severe - vedi il quarto proiettile sopra); denota F ⊥1 ... ⊥n, dove n è l'arietà di F.

Il 'quarto proiettile' di cui la parentesi afferma che si tratta di un errore statico per costruire un valore con la sintassi di registrazione che omette un rigoroso campo.

E nella sezione relativa pattern matching, una delle regole grammaticali per modelli è

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

e la semantica sono riportati nella sottosezione sulla semantica formale di pattern-matching (3.17.3) come

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

Questa sintassi è utile, perché anche se il numero di argomenti al costruttore 'A' modifiche, la definizione della funzione deve non cambia. Con una corrispondenza regolare (ad es. 'A _ _ -> ...') questo non sarebbe il caso. –

+0

@ Daniel - ma in questo caso stiamo parlando non di espressioni, ma i modelli. Penso che 'F {}' dovrebbe essere equivalente a 'F _1 _2 ... _n'where * n * è l'arità del costruttore. – Ingo

+0

@Ingo Right. Solo ieri sera ho visto la sezione "semantica informale", non ho trovato nulla, ma la parte dell'espressione si è distinta. L'ho trovato nella sezione formale della semantica dopo alcune ore di sonno. –

Problemi correlati