我正在Haskell中编写一个函数,该函数以递归方式返回列表,其中列出了从列表前面删除的指定数量的元素。我已经完成了这项工作:
removefront :: Int -> [Int] -> [Int]
removefront n xs =
if n <= 0 then xs
else removefront (n-1) (tail xs)
这有效,并且完全符合我的要求但是有一种方法可以在没有尾部功能的情况下做同样的事情。谢谢!
答案 0 :(得分:5)
这个函数是“内置的”,因为它在前奏中并被称为drop
*Main> :t drop
drop :: Int -> [a] -> [a]
*Main> drop 3 [1,2,3,4,5,6,7]
[4,5,6,7]
现在,我认为这不是你要找的答案。您可以轻松修改您的功能以不使用尾部。诀窍是使用模式匹配。
removefront :: Int -> [Int] -> [Int]
removefront n (x:xs) = if n <= 0 then (x:xs) else removefront (n-1) xs
三个音符
大多数Haskeller不会使用if then else
来表示这样的功能,更喜欢看守
removefront n (x:xs)
| n <= 0 = (x:xs)
| otherwise = removefront (n-1) xs
removefront
的类型可以更加通用
removefront :: Int -> [a] -> [a]
实际上它可以一直到
removefront :: (Num i, Ord i) => i -> [a] -> [a]
但这是过度的
你应该考虑将你的功能交给空列表时会发生什么 - 你想要它做什么?