gpt4 book ai didi

string - Haskell中case语句中的模式匹配变量

转载 作者:行者123 更新时间:2023-12-03 23:59:56 26 4
gpt4 key购买 nike

如果我使用 case 语句将字符串文字与字符串文字进行比较,我会得到预期的行为:如果它们相同 - 它匹配,如果它们不匹配 - 它不匹配。

但是,如果我将字符串文字与作为字符串的常量进行比较,则会收到“模式匹配重叠”警告,并且具有常量的分支始终匹配。

这是一个示例 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"

同时,如果行为符合预期:
> Prelude> if var1 == var2 then "Fail" else "Win" 
"Win"

这里发生了什么?这种行为有什么意义?

最佳答案

请参阅 Don 的答案以了解原因。做你想做的事情的一个常见习语是:

var1 = "abc"
var2 = "def"

foo x = case () of
() | x == var1 -> "Fail"
| x == var2 -> "Failzor"
| otherwise -> "WIN"

当然,在这种情况下,我们会丢失 case并且直接在函数上写守卫:
foo x | x == var1 = "Fail"
| ...

更新

这些天 MultiWayIf 扩展用稍微少一点的句法噪音来做到这一点。
{-# LANGUAGE MultiWayIf #-}

foo x = if | x == var1 -> "Fail"
| x == var2 -> "Failzor"
| otherwise -> "WIN"

关于string - Haskell中case语句中的模式匹配变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3479116/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com