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"
何が起きてる?この動作はどのように意味がありますか?