模式匹配的平等

Pet*_*ete 4 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
Run Code Online (Sandbox Code Playgroud)

上面的函数应该采用Char c并返回一个只匹配的Parser c.该函数dvChar d将返回Parsed char dpNoParse(char字符串中的下一个字符).因此,我曾希望Parsed c dp只匹配一个结果char==c,但实际发生的是该函数返回的Parser匹配任何字符(即使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
Run Code Online (Sandbox Code Playgroud)

手动编写解析器来解析字母'a'也可以正常工作

case dvChar d of
   Parsed 'a' dp -> Parsed 'a' dp
   _ -> NoParse
Run Code Online (Sandbox Code Playgroud)

如果角色是,则只会返回成功'a'.

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

scl*_*clv 7

是的,你只能匹配文字.实际上,更好的思考方式是你只能匹配构造函数,而Int,Char,String&co就是这样.都有文字构造函数.

请注意,您也可以混合使用case和guard并将其写为(从内存中):

parserChar :: Char -> Parser Char
parserChar c = Parser ch where
   ch d = case dvChar d of
      Parsed char dp | char == c -> Parsed char dp
      _ -> NoParse
Run Code Online (Sandbox Code Playgroud)