Знак равенства с литералами 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.