我在 Haskell 中编写了一个函数,它递归地返回列表,并从列表的前面删除了指定数量的元素。我已经让它工作了:
removefront :: Int -> [Int] -> [Int]
removefront n xs =
if n <= 0 then xs
else removefront (n-1) (tail xs)
这可以工作并且完全符合我的要求,但是有没有办法在没有尾部功能的情况下做同样的事情。谢谢!
我在 Haskell 中编写了一个函数,它递归地返回列表,并从列表的前面删除了指定数量的元素。我已经让它工作了:
removefront :: Int -> [Int] -> [Int]
removefront n xs =
if n <= 0 then xs
else removefront (n-1) (tail xs)
这可以工作并且完全符合我的要求,但是有没有办法在没有尾部功能的情况下做同样的事情。谢谢!
这个功能是“内置”的,因为它在前奏中并被称为 drop
*Main> :t drop
drop :: Int -> [a] -> [a]
*Main> drop 3 [1,2,3,4,5,6,7]
[4,5,6,7]
现在,我假设这不是您要寻找的答案。您可以轻松修改函数以不使用 tail。诀窍是使用模式匹配。
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]
但这越来越过分了
您应该考虑将空列表交给函数时会发生什么——您希望它做什么?