【发布时间】: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 (..) 仍然需要手动编码),还是我做错了什么?
【问题讨论】:
-
顺便说一句,“只匹配构造函数”规则绝对是个好东西,因为否则导入一个新的顶层定义(比如说)可能会极大地改变一段代码的语义!跨度>