私は 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
誰でもこれについて理解するのを手伝ってもらえますか?