型によるプログラミング パラメータ化された型 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
%