計算機科学のブログ

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

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

コード

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

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

入出力結果(Terminal, Zsh)

% ghci
GHCi, version 8.10.4: https://www.haskell.org/ghc/  :? for help
macro 'doc' overwrites builtin command.  Use ':def!' to overwrite.
(0.00 secs, 0 bytes)
(0.00 secs, 0 bytes)
Loaded GHCi configuration from /.../.ghc/ghci.conf
Prelude
λ> :load sample01
[1 of 1] Compiling Main             ( sample01.hs, interpreted )
Ok, one module loaded.
(0.02 secs,)
*Main
λ> inc x = x + 1
inc :: Num a => a -> a
(0.00 secs, 27,392 bytes)
*Main
λ> (getIfXEven 0) inc
1
it :: Integral p => p
(0.01 secs, 60,320 bytes)
*Main
λ> (getIfXEven 1) inc
1
it :: Integral p => p
(0.01 secs, 60,056 bytes)
*Main
λ> (getIfXEven 2) inc
3
it :: Integral p => p
(0.00 secs, 60,208 bytes)
*Main
λ> (getIfXEven 5) inc
5
it :: Integral p => p
(0.01 secs, 60,056 bytes)
*Main
λ> (getIfXEven 10) inc
11
it :: Integral p => p
(0.00 secs, 60,944 bytes)
*Main
λ> :quit
Leaving GHCi.
%