We distinguish two cases within this syntax: a pattern binding occurs when the left hand side is a pat; otherwise, the binding is called a function binding. Either binding may appear at the top-level of a module or within a where or let construct.
modelli hanno la seguente sintassi:
pat → lpat qconop pat (infix constructor)
| lpat
lpat → apat
| - (integer | float) (negative literal)
| gcon apat1 … apatk (arity gcon = k, k ≥ 1)
apat → var [ @ apat] (as pattern)
| gcon (arity gcon = 0)
| qcon { fpat1 , … , fpatk } (labeled pattern, k ≥ 0)
| literal
| _ (wildcard)
| (pat) (parenthesized pattern)
| (pat1 , … , patk) (tuple pattern, k ≥ 2)
| [ pat1 , … , patk ] (list pattern, k ≥ 1)
| ~ apat (irrefutable pattern)
fpat → qvar = pat
Report Language afferma anche
A pattern binding binds variables to values. A simple pattern binding has form p = e. The pattern p is matched “lazily” as an irrefutable pattern, as if there were an implicit ~ in front of it.
Così, 0
in 0=1
è solo un modello. In sostanza, 0=1
e x=1
sono la stessa cosa. Sono entrambi associazioni di modelli.
Il modello è irrefutabile, 0=1
non fallisce, quindi non si è verificato alcun errore e non è successo nulla.
Se è presente la seguente dichiarazione di livello superiore. Succederà qualcosa
[email protected](Just y) | z /= Nothing = Just 1
where
z = Just 0