2

我在 Haskell 中编写了一个函数,它递归地返回列表,并从列表的前面删除了指定数量的元素。我已经让它工作了:

removefront :: Int -> [Int] -> [Int]
removefront n xs =
    if n <= 0 then xs
    else removefront (n-1) (tail xs)

这可以工作并且完全符合我的要求,但是有没有办法在没有尾部功能的情况下做同样的事情。谢谢!

4

1 回答 1

5

这个功能是“内置”的,因为它在前奏中并被称为 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

三个音符

  1. 大多数 Haskeller 不会使用if then else这样的功能,更喜欢看守

    removefront n (x:xs) 
       | n <= 0    = (x:xs)
       | otherwise = removefront (n-1) xs
    
  2. 的类型removefront可以更通用

    removefront :: Int -> [a] -> [a]
    

    实际上它可能一直到

    removefront :: (Num i, Ord i) => i -> [a] -> [a]
    

    但这越来越过分了

  3. 您应该考虑将空列表交给函数时会发生什么——您希望它做什么?

于 2012-09-30T06:26:16.163 回答