实现Haskell的intOrUppercase解析器时遇类型匹配问题求助
问题解决:实现
intOrUppercase :: Parser () 核心问题分析
你遇到的类型不匹配错误,本质是Alternative类型类的<|>操作要求两个组合的Parser必须返回相同类型的结果:(<|>) :: Parser a -> Parser a -> Parser a。而你尝试组合的satisfy isUpper返回Parser Char,posInt返回Parser Integer,类型不一致,因此无法直接用<|>组合。
解决方案
把两个解析器都转换为返回()的Parser,统一类型后再用<|>组合。可以复用你之前实现abParser_时用到的const () <$>,将任意Parser a映射为Parser ()。
正确实现代码
intOrUppercase :: Parser () intOrUppercase = (const () <$> satisfy isUpper) <|> (const () <$> posInt)
代码解释
const () <$> satisfy isUpper:将解析单个大写字母的Parser Char转换为Parser (),解析成功时丢弃字符结果,返回()。const () <$> posInt:将解析正整数的Parser Integer转换为Parser (),解析成功时丢弃整数结果,返回()。<|>:尝试第一个解析器,失败则尝试第二个,任意一个成功就返回()和剩余输入,都失败则返回Nothing。
验证示例结果
运行代码后,完全符合题目要求:
*Parser> runParser intOrUppercase "342abcd" Just ((), "abcd") *Parser> runParser intOrUppercase "XYZ" Just ((), "YZ") *Parser> runParser intOrUppercase "foo" Nothing
内容的提问来源于stack exchange,提问作者Kofu
相关产品推荐
相关产品推荐

