If I compare a string literal to a string literal using the case statement, I get the expected behavior: if they are the same - it matches, if they are not - it does not.
However, if I compare a string literal to a constant that is a string, I get "Pattern matches are overlapped" warning and the branch with the constant always matches.
Here's an example session:
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"
Meanwhile, if behaves as expected:
> Prelude> if var1 == var2 then "Fail" else "Win"
"Win"
What's going on here? How does this behavior make sense?