Знак равенства с литералами haskell

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

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

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

Ответы

Ответ 1

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

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

Ответ 2

Если вы даете паттерну неудачи совпадение с именем 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 описывает


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.

Patterns have this syntax:


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 

В отчете "Язык" также указано

Связывание с образцом связывает переменные со значениями. Простая привязка шаблона имеет форму p = e. Образец p сопоставляется "лениво" как неопровержимый образец, как будто перед ним есть неявное ~.

Итак, 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.