型によるプログラミング パラメータ化された型 map関数
入門Haskellプログラミング (Will Kurt(著)、株式会社クイープ(監修、翻訳)、翔泳社)のUNIT3(型によるプログラミング)、LESSON 18(パラメータ化された型)、18.4(練習問題)Q18-1の解答を求めてみる。
コード
lesson/app/Main.hs
module Main where
import Lib
t :: Triple Int
t = Triple 1 2 3
b :: Box Int
b = Box 10
main :: IO ()
main = do
print t
print $ tripleMap show t
print $ tripleMap (* 2) t
print b
print $ boxMap show b
print $ boxMap (* 2) b
lesson/src/Lib.hs
module Lib where
data Box a = Box a deriving (Show)
wrap :: a -> Box a
wrap = Box
unwrap :: Box a -> a
unwrap (Box x) = x
boxMap :: (t -> a) -> Box t -> Box a
boxMap f b = Box $ f $ unwrap b
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)
入出力結果(Terminal, Zsh)
% stack exec lesson-exe
Triple 1 2 3
Triple "1" "2" "3"
Triple 2 4 6
Box 10
Box "10"
Box 20
%