我想编写一个Haskell函数,其行为依赖于匹配其中一个参数的正则表达式模式。在像C / Python / Perl这样的语言中,我肯定会使用一个大的if / else结构,但我真的没有那个选项。什么是最惯用的Haskell处理方法?
我考虑过警卫,但他们不起作用: Object {readyState: 4, responseText: "<div class="royal_selection_heading royal_heading_…rapper featured-item-list">
↵
↵
↵ ", status: 500, statusText: "Internal Server Error"}
:
No instance for (Data.String.IsString source0)
如果处理正则表达式,则案例结构中使用的模式匹配将是完美的。
function arg
| arg =~ "pattern1" = dothis arg
| arg =~ "pattern2" = dothat arg
| otherwise = failwith arg
答案 0 :(得分:13)
您的第一个示例 为我工作:
import Text.Regex.Posix
function :: String -> String
function arg
| arg =~ "pattern1" = "1"
| arg =~ "pattern2" = "2"
| otherwise = "3"
我认为您的IsString
错误是由于重载的字符串文字扩展名造成的。尝试禁用它,或者尝试使用显式String
字符串:
function :: String -> String
function arg
| arg =~ ("pattern1"::String) = "1"
| arg =~ ("pattern2"::String) = "2"
| otherwise = "3"
太吵了?你可以把残骸推到最后一行。
function2 :: String -> String
function2 arg
| arg =~ s"pattern1" = "1"
| arg =~ s"pattern2" = "2"
| otherwise = "3"
where s :: String -> String
s = id
需要子组匹配吗?
function3 :: String -> String
function3 arg
| [_,x]:_ <- arg =~ s"pat(t*)ern1" = "matched group: " ++ x
-- ...
在function3 "patttern1"
上,变量x
将绑定到"tt"
。在function3 "xyz"
上,测试将失败,并且将尝试下一个分支。