計算機科学のブログ

型によるプログラミング パラメータ化された型 mapと同様の関数の実装

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

コード

data Triple a = Triple a a a deriving Show
data Box a = Box a deriving Show

tripleMap :: (a -> b) -> Triple a -> Triple b 
tripleMap func (Triple x y z) = Triple (func x) (func y) (func z)

boxMap:: (a -> b) -> Box a -> Box b
boxMap func (Box x) = Box (func x)

t :: Triple Integer
t = Triple 1 2 3

b :: Box Integer
b = Box 2

f :: Integer -> Double 
f n = fromInteger (2 * n)

入出力結果(Terminal, Zsh)

% ghci
GHCi, version 8.10.5: https://www.haskell.org/ghc/  :? for help
macro 'doc' overwrites builtin command.  Use ':def!' to overwrite.
(0.00 secs, 0 bytes)
(0.00 secs, 0 bytes)
Loaded GHCi configuration from /.../.ghc/ghci.conf
Prelude
λ> :load sample1.hs 
[1 of 1] Compiling Main             ( sample1.hs, interpreted )
Ok, one module loaded.
(0.06 secs,)
*Main
λ> t
Triple 1 2 3
it :: Triple Integer
(0.01 secs, 72,584 bytes)
*Main
λ> tripleMap f t
Triple 2.0 4.0 6.0
it :: Triple Double
(0.00 secs, 78,928 bytes)
*Main
λ> b
Box 2
it :: Box Integer
(0.00 secs, 63,704 bytes)
*Main
λ> boxMap f b
Box 4.0
it :: Box Double
(0.01 secs, 66,688 bytes)
*Main
λ> :quit
Leaving GHCi.
%