Haskell递归修改LocalType列表时Prl字段提取出现变量未定义报错如何解决
错误原因
- 你在守卫语句中使用
x == (Prl s Bar ss)做相等判断,这一逻辑无法将Prl构造器的两个参数绑定到s、ss变量,Haskell只能通过模式匹配提取代数数据类型的字段值,因此触发了变量未定义的报错 - 原有递归逻辑存在问题:遇到End时调用
sepTimes (x:xs)会进入死循环,do块用法不符合纯列表处理的需求,也没有实现「ss追加到列表末尾」的逻辑
正确实现代码
sepTimes :: [LocalType] -> [LocalType] sepTimes [] = [] -- 匹配End元素,直接保留 sepTimes (End : xs) = End : sepTimes xs -- 匹配带Bar分隔符的Prl元素,s放当前位置,ss追加到结果末尾 sepTimes (Prl s Bar ss : xs) = s : sepTimes xs ++ [ss] -- 如需处理Prl带其他分隔符的情况,可补充对应分支
逻辑验证
对应你给出的示例:
- 输入
[End, Prl s Bar ss],处理后返回End : (s : [] ++ [ss]) = [End, s, ss],符合预期 - 输入
[End, Prl End Bar End],处理后返回End : (End : [] ++ [End]) = [End, End, End],符合预期
内容的提问来源于stack exchange,提问作者polo
相关产品推荐
相关产品推荐

