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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 01:06:07