2013-09-03 16 views
18

Co dokładnie dzieje się w GHCi, gdy ładuję plik z linią, która mówi: 0 = 1?znak równości z literkami haskella

Spodziewałem się, że spowoduje to błąd, ale wydaje się, że nic nie robi. Czy coś robi?

Zakładam, że w GHCi jest to równoważne z powiedzeniem "niech 0 = 1". Co to oznacza?

Odpowiedz

22

Wiązanie 0 w twoim let jest w rzeczywistości wzorcem pasującym do literału 0. Nie byłam pewna, co się dzieje na początku też, ale można to potwierdzić za pomocą wzoru ścisłego dopasowania tak:

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

Jeśli dasz niewydolnego Dopasowanie do wzorca nazwy x, można też zmusić go jak tak:

x @ 0 = 1 
main = print x 

która produkuje błąd:

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

0=1 jest tylko wzór wiążący.

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.

Wzory mają tę składnię:


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 

Raport Język stwierdza również

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.

Więc 0 w 0=1 to tylko wzór. W istocie, 0=1 i x=1 to to samo. Oba są powiązaniami wzorów.
Wzór jest niezastąpiony, 0=1 nie zawiedzie, więc nie wystąpił błąd i nic się nie stało.

Jeśli mamy następującą deklarację najwyższego poziomu. Coś się wydarzy.

[email protected](Just y) | z /= Nothing = Just 1 
    where 
    z = Just 0 

x i y wiążą się Just 1 i 1.

Powiązane problemy