Se si confronta una stringa letterale con una stringa letterale utilizzando l'istruzione case, ottengo il comportamento previsto: se sono uguali - corrisponde, se non lo sono - non lo fa .Variabili di pattern matching in un'istruzione case in Haskell
Tuttavia, se si confronta una stringa letterale con una costante che è una stringa, viene visualizzato l'avviso "Motivo ripetuto sovrapposto" e il ramo con la costante corrisponde sempre.
Ecco una sessione di esempio:
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"
Nel frattempo, se si comporta come previsto:
> Prelude> if var1 == var2 then "Fail" else "Win"
"Win"
cosa sta succedendo qui? Come ha senso questo comportamento?
Grazie, signori. Hai spiegato sia cosa stava succedendo che come abbinare una stringa di input a valori codificati. –
Desidero documentazione e varie esercitazioni in cui esplicito che a) l'affermazione del caso è modello che corrisponde a una sintassi diversa eb) diversa dalla somiglianza superficiale Il caso di Haskell non ha nulla in comune con l'interruttore di C. Risolvono diversi problemi. –
Questo è anche spiegato nel libro (gratuito) [Real World Haskell] (http://book.realworldhaskell.org/read/defining-types-streamlining-functions.html#id587485). – Flow