list之Haskell 模式匹配出错

over140 阅读:27 2024-04-12 10:01:50 评论:0

我正在学习一些 Haskell,我正在努力了解模式匹配的工作原理。 为此,我编写了一个简单的 nth 函数。

nth' :: Integer -> [a] -> a 
nth' n [] = error "Index out of bound" 
nth' n (x:xs) = if n == 0 then x else nth' (n - 1) xs 

这第一个实现似乎按预期工作。

-- nth' 25 ['a'..'z'] 
-- 'z' 
-- nth' 26 ['a'..'z'] 
-- *** Exception: Index out of bound 

但是,当我重构它并用模式匹配替换 if 语句时,我最终得到了“索引超出范围”异常,而我显然不应该这样做。

nth' :: Integer -> [a] -> a 
nth' _ [] = error "Index out of bound" 
nth' 0 (x:[]) = x 
nth' n (_:xs) = nth' (n - 1) xs 
 
-- nth' 2 ['a'..'z'] 
-- *** Exception: Index out of bound 

我做错了什么?

请您参考如下方法:

模式 x:[] 匹配一个只包含一个元素的列表。所以你的 nth' 0 (x:[]) 只有当第一个参数是 0 并且第二个参数是一个单元素列表时才会执行。如果第二个参数是一个包含多个参数的列表,它将进入最后一种情况。

你需要把第二种情况改成nth' 0 (x:_) = x,这样不管列表中有多少个元素它都匹配(只要至少有一个).


标签:程序员
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号