haskell - Extraña coincidencia de patrones: ¿es correcto?
pattern-matching (2)
La
b
en la definición del caso
no
es la
b
en el encabezado de la definición
f
.
Creó una
nueva variable de ámbito local
.
Su código es así equivalente a:
f a b = case a of
c -> True
_ -> False
La coincidencia de patrones con una variable siempre tiene éxito.
Si desea verificar si dos valores son iguales, deberá definir alguna función (o dejar que Haskell derive
Eq
automáticamente, por ejemplo).
Nota : puede activar la
-Wname-shadowing
para permitir que el compilador le advierta sobre la creación de identificadores que sombreen los existentes. Por ejemplo, su código producirá:
Prelude> f a b = case a of b -> True; _ -> False <interactive>:1:19: warning: [-Wname-shadowing] This binding for ‘b’ shadows the existing binding bound at <interactive>:1:5
¿Por qué esta función siempre tiene éxito?
Siempre devuelve
True
con cualquier valor y cualquier tipo.
¿Es este el comportamiento correcto?
f a b = case a of b -> True; _ -> False
Solo además de la respuesta perfecta aceptada, mis dos centavos:
esta:
f a b = case a of b -> True; _ -> False -- (A)
y esto:
f a b = case a of
c -> True
_ -> False --(B)
are es equivalente a:
f a b = case a of
_ -> True
o
f a b = True
o
f _ b = True
Entonces, tenga cuidado porque ese es el comportamiento real que creó, una función que toma dos parámetros y devuelve siempre True.
También:
(A)
y
(B)
mostrarán esta advertencia si se
-Woverlapping-patterns
:
warning: [-Woverlapping-patterns]
Pattern match is redundant
In a case alternative: _ -> ...
|
3 | _ -> False
| ^^^^^^^^^^