計算機科学のブログ

関数型プログラミングの基礎 - 高階関数 - リストのフィルタリング

入門Haskellプログラミング (Will Kurt(著)、株式会社クイープ(監修、翻訳)、翔泳社)の UNIT1(関数型プログラミングの基礎)、LESSON 9(高階関数)、9.3(リストのフィルタリング)、クイックチェック9-1の解答を求めてみる。

コード

sample1.hs

main = do
  print $ remove even [1 .. 10]
  print $ remove1 even [1 .. 10]
  print $ remove2 even [1 .. 10]
  print $ remove3 even [1 .. 10]

remove :: (a -> Bool) -> [a] -> [a]
remove test [] = []
remove test (x:xs) = if test x
    then remove test xs
    else x:remove test xs

remove1 :: (t -> Bool) -> [t] -> [t]
remove1 test xs = filter (\x -> not (test x)) xs

remove2 :: (t -> Bool) -> [t] -> [t]
remove2 test = filter (\x -> not (test x))

remove3 :: (a -> Bool) -> [a] -> [a]
remove3 test = filter (not . test)

入出力結果(Terminal, Zsh)

% runghc sample1.hs 
[1,3,5,7,9]
[1,3,5,7,9]
[1,3,5,7,9]
[1,3,5,7,9]
%