segundo - signo igual con los literales haskell
signos matematicos (3)
Si le asignas a la coincidencia del patrón que falla un nombre x
, también puedes forzarlo así:
x @ 0 = 1
main = print x
Lo que produce el error:
FILE.hs: /path/to/FILE.hs:1:5-13: Irrefutable pattern failed for pattern x@0
¿Qué sucede exactamente en GHCi cuando cargo un archivo con una línea que dice: 0 = 1?
Esperaba que esto diera un error pero no parece hacer nada en absoluto. ¿Hace algo?
Supongo que en GHCi es equivalente a decir "dejar 0 = 1". ¿Qué hace eso?
0=1
es solo un enlace de patrón.
Informe de idiomas de Haskell 2010 describe
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
Distinguimos dos casos dentro de esta sintaxis: una vinculación de patrón ocurre cuando el lado izquierdo es una palmadita ; de lo contrario, el enlace se llama enlace de función . Cualquiera de los enlaces puede aparecer en el nivel superior de un módulo o dentro de donde o dejar construir.
Los patrones tienen esta sintaxis:
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
Informe de idioma también indica
Un enlace de patrón une variables a valores. Un patrón simple de enlace tiene la forma p = e. El patrón p se empareja "perezosamente" como un patrón irrefutable, como si hubiera un ~ implícito delante de él.
Entonces, 0
en 0=1
es solo un patrón. En esencia, 0=1
y x=1
son la misma cosa. Ambos son patrones de unión.
El patrón es irrefutable, 0=1
no falla, por lo tanto, no ocurrió ningún error y no sucedió nada.
Si tenemos la siguiente declaración de nivel superior. Algo va a pasar.
x@(Just y) | z /= Nothing = Just 1
where
z = Just 0
x
e y
son vinculantes a Just 1
y 1.
El 0
en su enlace de let
es en realidad una coincidencia de patrón en el 0
literal. No estaba seguro de lo que estaba pasando al principio también, pero puedes confirmarlo utilizando una coincidencia de patrones estricta, como por ejemplo:
Prelude> :set -XBangPatterns
Prelude> let !0 = 1 in 0
*** Exception: <interactive>:13:5-10: Non-exhaustive patterns in pattern binding