計算機科学のブログ

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