6

私は Haskell を 1 か月ほど独学してきましたが、今日、16 番目の問題の解決策を読んでいて、質問を思いつきました。

ここにリンクがあります: http://www.haskell.org/haskellwiki/99_questions/Solutions/16

基本的に、この質問では、リストから N 番目ごとの要素を削除する関数を作成するよう求められます。例えば、

*Main> dropEvery "abcdefghik" 3

"abdeghk"

リンクの最初の解決策は

dropEvery :: [a] -> Int -> [a]
dropEvery [] _ = []
dropEvery (x:xs) n = dropEvery' (x:xs) n 1 
  where
       dropEvery' (x:xs) n i = (if (n `divides` i) then [] else [x])++ (dropEvery' xs n (i+1))
       dropEvery' [] _ _ = []
       divides x y = y `mod` x == 0

私の質問は、dropEvery' が空のリストを処理できるのに、なぜ dropEvery が空のリストのケースを定義するのかということです。dropEvery [] _ = []以下は上記とまったく同じように機能し、短く見えるはずなので、単純に削除して他の文を少し変更できると思います。

dropEvery :: [a] -> Int -> [a]
dropEvery xs n = dropEvery' xs n 1 
  where
       dropEvery' (x:xs) n i = (if (n `divides` i) then [] else [x])++ (dropEvery' xs n (i+1))
       dropEvery' [] _ _ = []
       divides x y = y `mod` x == 0

誰でもこれについて理解するのを手伝ってもらえますか?

4

1 に答える 1