如果我使用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"
这是怎么回事?这种行为如何有意义?
谢谢,先生们。您解释了发生了什么以及如何将输入字符串与硬编码值匹配。 – 2010-08-14 08:05:35
我希望在文档和各种教程中明确指出:a)case语句与不同语法的模式匹配; b)除表面相似之外Haskell的情况与C的开关没有任何共同之处。他们解决不同的问题。 – 2010-08-14 08:17:51
这在(免费)书[Real World Haskell](http://book.realworldhaskell.org/read/defining-types-streamlining-functions.html#id587485)中也有很好的解释。 – Flow 2012-08-22 20:53:32