在 haskell 函数守卫中使用正则表达式
Using regexp in haskell function guards
我想编写一个 Haskell 函数,其行为取决于与其中一个参数匹配的正则表达式模式。在像 C/Python/Perl 这样的语言中,我肯定会使用一个大的 if/else 结构,但我真的没有那个选项。最惯用的 Haskell 处理方式是什么?
我考虑过守卫,但他们不起作用:No instance for (Data.String.IsString source0)
:
function arg
| arg =~ "pattern1" = dothis arg
| arg =~ "pattern2" = dothat arg
| otherwise = failwith arg
如果处理 Regex,用在 case 构造中的模式匹配将是完美的。
function arg = case arg of
(pattern1 match) -> dothis match
(pattern2 match) -> dothat match
_ -> failwith arg
你的第一个例子对我有用:
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"
,测试将失败,将尝试下一个分支。
我想编写一个 Haskell 函数,其行为取决于与其中一个参数匹配的正则表达式模式。在像 C/Python/Perl 这样的语言中,我肯定会使用一个大的 if/else 结构,但我真的没有那个选项。最惯用的 Haskell 处理方式是什么?
我考虑过守卫,但他们不起作用:No instance for (Data.String.IsString source0)
:
function arg
| arg =~ "pattern1" = dothis arg
| arg =~ "pattern2" = dothat arg
| otherwise = failwith arg
如果处理 Regex,用在 case 构造中的模式匹配将是完美的。
function arg = case arg of
(pattern1 match) -> dothis match
(pattern2 match) -> dothat match
_ -> failwith arg
你的第一个例子对我有用:
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"
,测试将失败,将尝试下一个分支。