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

跟随Haskell课程编写getNth函数遇非穷尽模式匹配错误求助

解决Haskell getNth函数的非穷尽模式匹配错误

你遇到的错误是因为函数的模式匹配没有覆盖所有可能的输入情况。GHC的提示已经明确指出:Patterns of type Int, [a] not matched: _ []——你的函数只定义了对非空列表(x:xs)的处理逻辑,完全没考虑传入**空列表[]**的情况,不管此时n是什么值,函数都找不到对应的匹配分支。

为什么教授的代码看起来没问题?

大概率是教授在课堂上为了演示递归基础逻辑,暂时忽略了边界情况,或者当时没有开启GHC的警告检查。但GHC默认会严格校验所有可能的输入模式,所以实际运行时会触发错误。

修复方案

方案1:添加错误分支(简单直接)

给空列表添加明确的匹配分支,抛出错误提示:

getNth :: Int -> [a] -> a
getNth n (x:xs) = if n == 0 then x else getNth (n-1) xs
getNth _ [] = error "getNth: 空列表或索引超出范围"

方案2:用Maybe类型返回(更安全)

如果不想抛出运行时异常,可以用Maybe类型封装结果,同时额外处理n为负数的情况,让函数更健壮:

getNth :: Int -> [a] -> Maybe a
getNth 0 (x:_) = Just x
getNth n (_:xs) | n > 0 = getNth (n-1) xs
getNth _ _ = Nothing

这种情况下,当输入非法(空列表、n为负、n超出列表长度)时,函数会返回Nothing;合法输入时返回Just 目标元素,避免程序崩溃。

内容的提问来源于stack exchange,提问作者Darren Trieu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 11:07:36