Haskell实现parseMany时出现类型不匹配报错问题求助
报错原因与代码问题分析
你遇到的类型不匹配报错核心来自parseMany递归调用的参数写法错误:Parse a类型的定义是String -> Maybe(a, String),因此parseMany的完整展开类型为(String -> Maybe(a, String)) -> String -> Maybe([a], String),需要接收两个参数:第一个是解析器函数,第二个是待解析的字符串。
你在递归分支写成了parseMany (z str'),直接触发了类型错误:
z是单次解析得到的结果值,类型为a,并非可调用的函数,z str'本身属于非法调用- 你只给
parseMany传了一个非法参数,此时返回值类型为String -> Maybe ([a1], String),但case语句要求分支判断的值为Maybe类型,二者无法匹配,就出现了你看到的报错信息。
其他隐藏问题
你在返回剩余字符串时多余调用了show str'':str''本身就是String类型,show处理字符串会额外添加引号、转义特殊字符,会破坏剩余待解析字符串的原始内容。
修正后代码
type Parse a = String -> Maybe(a, String) parseMany :: Parse a -> Parse [a] parseMany p str = case p str of -- 匹配失败时返回空列表和原始字符串,对应0次匹配 Nothing -> Just ([], str) -- 匹配成功时递归解析剩余字符串,拼接结果 Just (z, str') -> case parseMany p str' of Just (c, str'') -> Just (z : c, str'')
内容的提问来源于stack exchange,提问作者scorval
相关产品推荐
相关产品推荐

