計算機科学のブログ

関数型プログラミングの基礎 クロージャと部分適用 中間演算子、if式、偶奇の判定、even関数

入門Haskellプログラミング (Will Kurt(著)、株式会社クイープ(監修、翻訳)、翔泳社)のUNIT1(関数型プログラミングの基礎)、LESSON5(クロージャと部分適用)、5.5(練習問題)Q5-1の解答を求めてみる。

コード

inc :: Integer -> Integer
inc = (+ 1)

double :: Integer -> Integer
double = (* 2)

square :: Num a => a -> a
square x = x ^ 2

ifEven :: Integral p => (p -> p) -> p -> p
ifEven f x =
  if even x
    then f x
    else x

ifEvenInc :: Integer -> Integer
ifEvenInc = ifEven inc

ifEvenDouble :: Integer -> Integer
ifEvenDouble = ifEven double

ifEvenSquare :: Integer -> Integer
ifEvenSquare = ifEven square

xs = [-5 .. 5]

main :: IO ()
main = do
  print "inc"
  mapM_ (print . ifEvenInc) xs
  print "double"
  mapM_ (print . ifEvenDouble) xs
  print "square"
  mapM_ (print . ifEvenSquare) xs

入出力結果(Terminal, Zsh)

% runghc sample1.hs
"inc"
-5
-3
-3
-1
-1
1
1
3
3
5
5
"double"
-5
-8
-3
-4
-1
0
1
4
3
8
5
"square"
-5
16
-3
4
-1
0
1
4
3
16
5
%