You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 16:27:33