Если я сравниваю строковый литерал с строковым литералом с использованием оператора case, я получаю ожидаемое поведение: если они одинаковы - он совпадает, если они не являются - это не так.
Однако, если я сравниваю строковый литерал с константой, являющейся строкой, я получаю предупреждение "совпадения с шаблонами" и ветвь с константой всегда совпадает.
Вот пример сеанса:
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"
Между тем, если ведет себя так, как ожидалось:
> Prelude> if var1 == var2 then "Fail" else "Win"
"Win"
Что здесь происходит? Как это имеет смысл?