【问题标题】:Pattern matching for equality相等的模式匹配
【发布时间】:2010-07-19 23:15:27
【问题描述】:
parserChar :: Char -> Parser Char
parserChar c = Parser ch where
   ch d = case dvChar d of
      Parsed c dp -> Parsed c dp
      _ -> NoParse

上面的函数应该接受一个字符c并返回一个解析器,它只匹配c。函数dvChar d 将返回Parsed char dp 或NoParse(其中char 是字符串中的下一个字符)。因此,我曾希望 Parsed c dp 只匹配 char==c 的结果,但实际发生的是此函数返回的 Parser 匹配 any 字符(即使 c 似乎绑定到某个特定的 Char,作为函数参数)。

以下功能正常工作:

parserChar :: Char -> Parser Char
parserChar c = Parser ch where
   ch d = case dvChar d of
      Parsed char dp -> if char == c then Parsed char dp else NoParse
      _ -> NoParse

手动编码解析器以解析字母'a' 也可以正常工作,因为

case dvChar d of
   Parsed 'a' dp -> Parsed 'a' dp
   _ -> NoParse

只有当字符是'a'时才会返回成功。

那是什么?你只能匹配这样的模式中的文字(例如,尽管 Char 在 Eq 类中,if char==c (..) 仍然需要手动编码),还是我做错了什么?

【问题讨论】:

  • 顺便说一句,“只匹配构造函数”规则绝对是个好东西,因为否则导入一个新的顶层定义(比如说)可能会极大地改变一段代码的语义!跨度>

标签: haskell pattern-matching


【解决方案1】:

是的,您只能匹配文字。事实上,更好的思考方式是只能匹配构造函数,而 Int、Char、String & co.都有文字构造函数。

请注意,您也可以混合大小写和守卫并将其写为(从内存中):

parserChar :: Char -> Parser Char
parserChar c = Parser ch where
   ch d = case dvChar d of
      Parsed char dp | char == c -> Parsed char dp
      _ -> NoParse

【讨论】:

    猜你喜欢
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    • 2019-05-23
    • 1970-01-01
    • 2010-11-13
    • 2017-09-22
    • 1970-01-01
    • 2015-03-21
    相关资源
    最近更新 更多