我正在尝试实现一个从末尾返回k元素的递归函数.
这是我的尝试:
kElementFromEnd :: Int -> [x] -> x
kElementFromEnd _ [] = error "cannot request k item from empty list"
kElementFromEnd k [x]
| k < 0 = error "k must be non negative"
| k == 0 = last [x]
| otherwise = kElementFromEnd (k-1) (init [x])
Run Code Online (Sandbox Code Playgroud)
这是我收到的错误:
*Main> kElementFromEnd 2 [1,2,3]
*** Exception: EX2.hs:(4,1)-(8,54): Non-exhaustive patterns in function kElementFromEnd
Run Code Online (Sandbox Code Playgroud)
我真的不明白为什么haskell无法匹配模式.发生了什么我不理解?
谢谢
您只匹配空列表([])和单个元素列表([x]).我想你的意思来代替[x],它匹配一个单一的元素列表模式和单一的价值来分配的x,有简单的xs,一个它匹配任何列表格局尚未匹配.这看起来像
kElementFromEnd :: Int -> [x] -> x
-- This pattern matches the empty list
kElementFromEnd _ [] = error "cannot request k item from empty list"
-- This pattern is just a name, so it matches everything else
-- i.e. non-empty lists
kElementFromEnd k xs
| k < 0 = error "k must be non negative"
| k == 0 = last xs
| otherwise = kElementFromEnd (k-1) (init xs)
Run Code Online (Sandbox Code Playgroud)
它会起作用
> kElementFromEnd 0 [1..5]
5
> kElementFromEnd 4 [1..5]
1
> map (\i -> kElementFromEnd i [1..10]) [0..9]
[10,9,8,7,6,5,4,3,2,1]
Run Code Online (Sandbox Code Playgroud)