我正在学习一些 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
我究竟做错了什么?