我对模式匹配有疑问:
是否有可能以某种方式匹配(字符串++ [char] ++ anotherstring)?
我尝试过类似的事情:
f (s++";"++r) = s++r (the rhs is trivial, but its just for testing ;))
但这会导致解析错误。
答案 0 :(得分:9)
不,这是不可能的。模式匹配根据构建它们的构造函数解构值,因此您只能在模式匹配中使用构造函数应用程序来描述哪些值与模式匹配,哪些不匹配。
对于类似您的示例,case
效果很好,
f str = case break (== ';') str of
(s, _:r) -> s ++ r
_ -> error "No semicolon found"
答案 1 :(得分:4)
为了完整起见,可以无偿地使用GHC的ViewPatterns
扩展名,并将Daniel Fischer的例子重写为:
{-# LANGUAGE ViewPatterns #-}
f (break (== ';') -> (s, _:r)) = s ++ r
f _ = error "No semicolon found"
这当然是一种纯粹的美化改变,但如果您更喜欢通常的“方程组”语法而不是case
表达式,那就是它。
N.B。 - 我现在没有GHC,所以我实际上没有测试过上面的内容。
答案 2 :(得分:1)
不,不可能。 split中有许多功能可用于完成您要执行的操作。
答案 3 :(得分:0)
您可以使用类似于此处提出的方式进行此类模式匹配: