【问题标题】:Haskell pattern matching char in a stringHaskell模式匹配字符串中的字符
【发布时间】:2012-10-24 18:50:25
【问题描述】:

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

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

我尝试过类似的方法:

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

但这会导致解析错误。

【问题讨论】:

  • 我只是想指出一个包含多个分号的字符串会使这变得模棱两可。下面的解决方案假设您要匹配第一个分号,但一般来说,这样的函数是不确定的,应该返回一个可能为空的结果列表。

标签: haskell pattern-matching


【解决方案1】:

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

对于您的示例,case 效果很好,

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

【讨论】:

  • 这个问题要求的内容几乎与 n+k 模式的 String 字面对应,后者是最近从语言中删除的功能。因此,不仅不可能,而且变得不可能的可能性也越来越小。呃,可能。
【解决方案2】:

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

{-# LANGUAGE ViewPatterns #-}

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

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

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

【讨论】:

    【解决方案3】:

    不,这是不可能的。 split 中有许多功能,您可以使用它们来完成您正在尝试做的事情。

    【讨论】:

      【解决方案4】:

      您可以按照此处建议的方式进行这种模式匹配:

      Haskell pattern matching conundrum

      【讨论】:

        猜你喜欢
        • 2018-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-08
        • 2016-01-08
        • 1970-01-01
        相关资源
        最近更新 更多