計算機科学のブログ

関数型プログラミングの基礎 クロージャと部分適用 クロージャ:関数を使って関数を作成する

入門Haskellプログラミング (Will Kurt(著)、株式会社クイープ(監修、翻訳)、翔泳社)のUNIT1(関数型プログラミングの基礎)、LESSON5(クロージャと部分適用)、5.1(クロージャ:関数を使って関数を作成する)のクイックチェック 5-1の解答を求めてみる。

コード

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

genIfXEven :: Integral p => p -> (p -> p) -> p
genIfXEven x = \f -> ifEven f x

func1 :: (Integer -> Integer) -> Integer
func1 = genIfXEven 2

func2 :: (Integer -> Integer) -> Integer
func2 = genIfXEven 3

func :: Integer -> Integer
func = (*) 10

main = do
  print $ func1 func
  print $ func2 func

入出力結果(Terminal, Zsh)

% runghc sample01.hs 
20
3
%