Si comparo un literal de cadena con un literal de cadena utilizando la sentencia case, obtengo el comportamiento esperado: si son iguales - coincide, si no lo son - no lo hace .Variables de coincidencia de patrón en una declaración de caso en Haskell
Sin embargo, si comparo un literal de cadena con una constante que es una cadena, aparece la advertencia "Las coincidencias de patrón están superpuestas" y la rama con la constante siempre coincide.
He aquí un ejemplo de sesión:
Prelude> let var1 = "abc"
Prelude> let var2 = "def"
Prelude> case var1 of { var2 -> "Fail"; _ -> "Win" }
<interactive>:1:0:
Warning: Pattern match(es) are overlapped
In a case alternative: _ -> ...
"Fail"
Prelude> case "abc" of { var2 -> "Fail"; _ -> "Win" }
<interactive>:1:0:
Warning: Pattern match(es) are overlapped
In a case alternative: _ -> ...
"Fail"
Prelude> case "abc" of { "def" -> "Fail"; _ -> "Win" }
"Win"
Mientras tanto, si se comporta como se esperaba:
> Prelude> if var1 == var2 then "Fail" else "Win"
"Win"
lo que está pasando aquí? ¿Cómo tiene sentido este comportamiento?
Gracias, señores. Explicó qué estaba pasando y cómo hacer coincidir una cadena de entrada con valores codificados. –
Deseo documentación y varios tutoriales donde explícitamente a) declaración de caso es coincidencia de patrones con una sintaxis diferente yb) distinta de similitud superficial El caso de Haskell no tiene nada en común con el cambio de C. Ellos resuelven diferentes problemas. –
Esto también está bien explicado en el libro (gratuito) [Real World Haskell] (http://book.realworldhaskell.org/read/defining-types-streamlining-functions.html#id587485). – Flow