計算機科学のブログ

型によるプログラミング パラメータ化された型 入れ子 Triple:より便利なパラメータ化された型 リスト、map関数との比較

入門Haskellプログラミング (Will Kurt(著)、株式会社クイープ(監修、翻訳)、翔泳社)のUNIT3(型によるプログラミング)、LESSON18(パラメータ化された型)、18.1(引数をとる型)、Triple:より便利なパラメータ化された型、クイックチェック 18-2の解答を求めてみる。

コード

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

toList :: Triple a -> [a]
toList (Triple x y z) = [x, y, z]

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

t :: Triple Integer
t = Triple 1 2 3

ns :: [Integer]
ns = [1, 2, 3]

-- transformでもmapでも出来ること
t1 :: Triple Integer
t1 = transform (+ 1) t

ns1 :: [Integer]
ns1 = map (+ 1) ns

-- mapでしか出来ないこと
ns2 :: [Double]
ns2 = map (\n -> fromIntegral n / 2) ns

-- transformでは「Triple Integer」型から「Triple Double」型には出来ない

main = do
  print t
  print ns
  print ns1
  print ns2

入出力結果(Terminal, Zsh)

% runghc sample02.hs 
Triple 1 2 3
[1,2,3]
[2,3,4]
[0.5,1.0,1.5]
%