4

我有一个关于模式匹配的问题:

是否有可能以某种方式匹配 (string ++ [char] ++ anotherstring)?

我试过类似的东西:

f (s++";"++r) = s++r (the rhs is trivial, but its just for testing ;))

但这会导致解析错误。

4

4 回答 4

9

不,这是不可能的。模式匹配根据构建它们的构造函数来解构值,因此您只能在模式匹配中使用构造函数应用程序来描述哪些值与模式匹配,哪些不匹配。

对于像您的示例这样的东西, acase效果很好,

f str = case break (== ';') str of
          (s, _:r) -> s ++ r
          _        -> error "No semicolon found"
于 2012-10-24T18:52:29.273 回答
4

为了完整起见,可以免费使用 GHC 的ViewPatterns扩展,并将 Daniel Fischer 的示例重写为:

{-# LANGUAGE ViewPatterns #-}

f (break (== ';') -> (s, _:r)) = s ++ r
f _ = error "No semicolon found"

这当然是一个纯粹的装饰性变化,但如果您更喜欢通常的“方程组”语法而不是case表达式,那就是它。

注意——我现在手头没有 GHC,所以我没有实际测试过上述内容。

于 2012-10-24T19:08:39.237 回答
1

不,这是不可能的。split中有很多函数可以用来完成你想要做的事情。

于 2012-10-24T18:58:34.907 回答
1

您可以执行类似于此处建议的方式的这种模式匹配:

Haskell 模式匹配难题

于 2012-10-24T20:39:51.077 回答