haskell讲座后,但代码不工作

6ie5vjzr  于 2023-10-19  发布在  其他
关注(0)|答案(2)|浏览(126)

我沿着在一堂课上用haskell写了一个简单的函数

getNth :: Int -> [a] -> a
getNth n (x:xs) = if n == 0 then x else getNth (n-1) xs

然而,我得到的错误

Pattern match(es) are non-exhaustive
In an equation for `getNth':
    Patterns of type `Int', `[a]' not matched: _ []

我写的正是我的教授在讲座上写的,我错过了什么吗?
当我尝试在GHCi中运行时,它也不起作用

gfttwv5a

gfttwv5a1#

除非你在没有告诉我们的情况下启用了-Werror,否则你得到的消息只是一个警告,而不是错误,你的getNth函数将与内置的!!函数完全一样工作。你的函数和那个函数都是危险的,因为它们是 * 部分的 *:他们会因为某些输入而失败但是对于适当的输入,它会工作得很好。例如,getNth 2 "abcde"将返回'c'。如果它在GHCi中不起作用,我希望你传递了一个无效的输入,比如getNth 5 "abcde"

yh2wf1be

yh2wf1be2#

(x:xs)匹配一个包含一个或多个元素的列表。您的代码不处理空列表模式[]。由于在空列表中的任何索引处都找不到元素,因此可能会抛出异常,或者可能返回Maybe a,其中Nothing表示不存在这样的索引。

getNth :: Int -> [a] -> Maybe a
getNth _ [] = Nothing
getNth 0 (x:_) = Just x
getNth n (_:xs) = getNth (n-1) xs
Prelude> getNth 3 [2,3,4]
Nothing
Prelude> getNth 3 [2,3,4,5,6]
Just 5
Prelude> getNth 0 []
Nothing

相关问题