Переменные сопоставления с образцом в операторе case в Haskell

Если я сравниваю строковый литерал со строковым литералом, используя оператор 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"

Что тут происходит? Как это поведение имеет смысл?

Ответы на вопрос(3)

Ваш ответ на вопрос