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