2

リストの先頭から指定された数の要素が削除されたリストを再帰的に返す関数を Haskell で作成しています。私はこれを行うようにしました:

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

これは機能し、まさに私が望むことを行いますが、テール機能なしで同じことを行う方法はありますか. ありがとう!

4

1 に答える 1

5

この関数は、プレリュードにあり、ドロップと呼ばれるという意味で「組み込まれています」

*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

3 つのノート

  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 に答える