2013-09-03 11 views
18

Cosa succede esattamente in GHCi quando carico un file con una riga che dice: 0 = 1?uguale segno con haskell letterali

Mi aspettavo che questo avrebbe dato un errore ma non sembra fare nulla. Fa qualcosa?

Suppongo che sia equivalente in GHCi solo a dire "let 0 = 1". Cosa fa?

risposta

22

Il 0 nel binding let è in realtà una corrispondenza di modello sul letterale 0. Non ero sicuro di quello che stava succedendo in un primo momento anche, ma è possibile confermare questo utilizzando modello rigorosa corrispondenza in questo modo:

Prelude> :set -XBangPatterns 
Prelude> let !0 = 1 in 0 
*** Exception: <interactive>:13:5-10: Non-exhaustive patterns in pattern binding 
9

Se si dà il pattern partita in mancanza di un nome x, è anche possibile forzarlo come così:

x @ 0 = 1 
main = print x 

che produce l'errore:

FILE.hs: /path/to/FILE.hs:1:5-13: Irrefutable pattern failed for pattern [email protected] 
3

0=1 è solo un modello vincolante.

Haskell 2010 Language Report describes


4.4.3 Function and Pattern Bindings 

decl → (funlhs | pat) rhs 

funlhs → var apat { apat } 
    | pat varop pat 
    | (funlhs) apat { apat } 

rhs  → = exp [where decls] 
    | gdrhs [where decls] 

gdrhs → guards = exp [gdrhs] 

guards → | guard1, …, guardn   (n ≥ 1) 

guard → pat

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 

x e y sono vincolanti per Just 1 e 1.