模式匹配的平等

时间:2010-07-19 23:15:28

标签: haskell pattern-matching

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

上述函数应该使用Char c并返回仅与c匹配的Parser。函数dvChar d将返回Parsed char dpNoParse(其中char是字符串中的下一个字符)。因此,我曾希望Parsed c dp只匹配char==c的结果,但实际发生的是该函数返回的Parser匹配任何字符(即使{ {1}}似乎绑定到某个特定的Char,作为函数参数)。

以下功能正常运行:

c

手动编码解析器以解析字母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 时才会返回成功。

那是什么给出的?您是否只能以这样的模式匹配文字(例如,尽管Char在类Eq中,'a'仍然需要手动编码),或者我做错了什么?

1 个答案:

答案 0 :(得分:7)

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

请注意,您也可以将案例和警卫混合起来并将其写为(来自内存):

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