top page > computer > haskell > web_lecture > for_programmer > polymorphic_type.html
更新日:
文責: 重城良国

多相型

型引数

代数的データ型の定義には型引数を使うことができる。型引数を使ったデータ型はコンテナと考えられる。

同じ型の値ふたつ

twice.hs

定義

同じ型の値をふたつ保存する型を作る。

data Twice a = Twice a a deriving Show

これは複数の型を同時に定義したと考えられる。

% ghci twice.hs
*Main> Twice 3 8
Twice 3 8
*Main> Twice 'a' 'b'
Twice 'a' 'b'
*Main> Twice True False
Twice True False
*Main> :t Twice True False
Twice True False :: Twice Bool
*Main> Twice False 'a'

<interactive>:X:Y:
Couldn't match expected type `Bool' with actual type `Char'
In the second argument of `Twice', namely `'a''
In the expression: Twice False 'a'
In an equation for `it': it = Twice False 'a'

Twiceが存在する2つの値の型は同じ型変数aで宣言されている。同じ型でなければならない。

関数

型Twiceの2つの型に対して同じ値を適用する。

mapTwice :: (a -> b) -> Twice a -> Twice b
mapTwice f (Twice x y) = Twice (f x) (f y)

*Main> :reload
*Main> mapTwice even $ Twice 8 11
Twice True False
*Main> :m + Data.Char
*Main Data.Char> mapTwice ord $ Twice 'a' 'd'
Twice 97 100

同じ値の連続

rep.hs

定義

同じ値が何個も連続している値を意味する型を考える。

data Rep a = Rep Int a deriving Show

たとえば'a'が100個続いている値ならば

*Main> :load rep.hs
*Main> Rep 100 'a'
Rep 100 'a'

のようになる。すべて同じ値であることが保証されているならば、この型を使うことでリストを使うよりも空間効率が良くなる。

関数

この型をリストに変換する。

toList :: Rep a -> [a]
toList (Rep n x) = replicate n x

*Main> toList $ Rep 50 'a'
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"

オプション

option.hs

a型の値に場合によってはb型の値がオプションとしてつく型を考える。名前と、もしわかれば年齢、を保存するような場合に使える。

定義

data Option a b = Single a | Option a b deriving Show

*Main> :load option.hs
*Main> Single "Yoshio"
Single "Yoshio"
*Main> Option "Yoshio" 39
Option "Yoshio" 39

関数

この型の値から人を表現する文字列を作る。

human :: Option String Int -> String
human (Single n) = n
human (Option n a) = n ++ " (" ++ show a ++ ")"

*Main> human $ Single "Yoshio"
"Yoshio"
*Main> human $ Option "Yoshio" 39
"Yoshio (39)"

構文

[型構築子] [型引数1] [型引数2] ...
= [値構築子1] [型1-1] [型1-2] ...
| [値構築子2] [型2-1] [型2-2] ...
| ...

まとめ

代数的データ型は型変数を引数としてとることができる。型引数をとる型の多くはコンテナとみなすことができる。

課題

  1. 同じ型の値3つを格納する型Threeを定義せよ
  2. 上記の型の中身に同じ関数を適用する関数mapThreeを定義せよ

「値構築演算子」へもどる 「タプル」へ

正当なCSSです! HTML5 Powered with CSS3 / styling, and Semantics