haskell pattern-matching

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 | ^^^^^^^^^^