計算機科学のブログ

型によるプログラミング パラメータ化された型 TripleとBox、map関数

入門Haskellプログラミング (Will Kurt(著)、株式会社クイープ(監修、翻訳)、翔泳社)のUNIT3(型によるプログラミング)、LESSON18(パラメータ化された型)、18.4(練習問題)Q18-1の解答を求めてみる。

コード

data Box a = Box a deriving (Show)

boxMap :: (t -> a) -> Box t -> Box a
boxMap f (Box x) = Box $ f x

data Triple a = Triple a a a deriving (Show)

tripleMap :: (t -> a) -> Triple t -> Triple a
tripleMap f (Triple x y z) = Triple (f x) (f y) (f z)

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

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

b :: Box Integer
b = Box 2

t :: Triple Integer
t = Triple 3 1 2

main :: IO ()
main = do
  print "box"
  print b
  print "inc"
  print $ boxMap inc b
  print "double"
  print $ boxMap double b
  print "triple"
  print t
  print "inc"
  print $ tripleMap inc t
  print "double"
  print $ tripleMap double t

入出力結果(Terminal, Zsh)

% runghc sample1.hs
"box"
Box 2
"inc"
Box 3
"double"
Box 4
"triple"
Triple 3 1 2
"inc"
Triple 4 2 3
"double"
Triple 6 2 4
%