signos segundo quinto que primer para menos mayor matematicos mas imprimir igual grado ejercicios ejemplos haskell equality literals

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