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 dp
或NoParse
(其中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'
仍然需要手动编码),或者我做错了什么?
答案 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