Haskell用foldr拆分字符串为元组列表时非穷尽匹配错误求解
错误原因排查
你写的func函数的两个分支,都只匹配了累加器(foldr的第二个参数)为非空列表((c1,n1) : ps)的场景,完全没有覆盖累加器是空列表[]的情况,这就是报错提示的「非穷尽模式」的来源。
另外你现有的逻辑也存在功能错误:遇到空格时直接丢弃第一个元组的设计会把已经拼接完成的单词删掉,完全无法实现需求。
修复后的完整实现
splitSen :: String -> [(String,Int)] splitSen = filter (\(s, _) -> not $ null s) . foldr func [] where -- 处理空格的情况 func ' ' [] = [] func ' ' acc@(("", _):_) = acc func ' ' acc = ("", 0) : acc -- 处理非空格字符的情况 func c [] = [( [c], 1 )] func c ((s, n):ps) = (c:s, n+1) : ps
实现说明
- 全程只用了一次
foldr遍历字符串,没有用到length和(++)函数,符合要求 - 遇到空格时如果已经有完成的单词,会在列表头部插入一个空的占位元组
("",0),用来标记后续非空格字符需要开启新单词,避免不同单词拼接 - 最后过滤掉所有占位用的空字符串元组,就得到符合示例的输出结果
内容的提问来源于stack exchange,提问作者Bohdan Chornopolskyi
相关产品推荐
相关产品推荐

