リストの先頭から指定された数の要素が削除されたリストを再帰的に返す関数を 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)
これは機能し、まさに私が望むことを行いますが、テール機能なしで同じことを行う方法はありますか. ありがとう!
この関数は、プレリュードにあり、ドロップと呼ばれるという意味で「組み込まれています」
*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 つのノート
ほとんどの 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]
しかし、それは過剰になっています
関数に空のリストを渡したときに何が起こるかを検討する必要があります-何をしたいですか?