2013-09-03 3 views
18

Что именно происходит в GHCi, когда я загружаю файл с линией, которая говорит: 0 = 1?знак равенства с литералами haskell

Я ожидал, что это даст ошибку, но, похоже, ничего не делает. Он что-то делает?

Я предполагаю, что это эквивалентно в GHCi, просто говоря «давайте 0 = 1». Что это делает?

ответ

22

0 в вашем let связывание на самом деле соответствует шаблону по буквам 0. Я не был уверен, что происходит в первый тоже, но вы можете подтвердить это с помощью строгого шаблону, как так:

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

Если вы даете неисправного поиска по шаблону имени x, вы можете заставить его как так:

x @ 0 = 1 
main = print x 

Которая производит ошибку:

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

0=1 просто шаблон связывания.

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.

Образцы имеют следующий синтаксис:


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 

Язык докладе также говорится

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.

Таким образом, 0 в 0=1 это всего лишь образец. В сущности, 0=1 и x=1 - это то же самое. Они оба являются привязками шаблонов.
Образец неопровержимый, 0=1 не прерывается, поэтому ошибки не произошло, и ничего не произошло.

Если у нас есть следующее объявление верхнего уровня. Что-то случится.

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

x и y являются обязательными для Just 1 и 1.

Смежные вопросы