Haskell 型変数と型クラス

個人開発したアプリの宣伝
目的地が設定できる手帳のような使い心地のTODOアプリを公開しています。
Todo with Location

Todo with Location

  • Yoshiko Ichikawa
  • Productivity
  • Free

スポンサードリンク

型の確認
ghci> :t 'a'
'a' :: Char
ghci> :t 1
1 :: Num p => p
ghci> :t "string"
"string" :: [Char]
ghci> :t True
True :: Bool
ghci> :t [1,2]
[1,2] :: Num a => [a]
ghci> :t (1,2)
(1,2) :: (Num a, Num b) => (a, b)


関数の型宣言

文字列を受け取り、文字列を返す、型宣言。

removeNonUppercase.hs

removeNonUppercase :: [Char] -> [Char]
removeNonUppercase st = [c | c <- st, c `elem` ['A'..'Z']]
ghci> :l removeNonUppercase.hs 
[1 of 1] Compiling Main             ( removeNonUppercase.hs, interpreted )
Ok, one module loaded.
ghci> removeNonUppercase "Hello World"
"HW"

複数の引数を受け取る型宣言。

int2Triple :: Int -> Int -> Int -> (Int, Int, Int)
int2Triple a b c = (a, b, c)
ghci> int2Triple 3 4 6
(3,4,6)


型変数

関数headは、任意指定の型a型のリストを受け取り同じa型の値を返す。aを型変数と呼ぶ。

ghci> :t head
head :: [a] -> a

fstは型変数a,bからなるダブルを受け取りa型、つまり1つ目の型、の値を返す。

ghci> :t fst
fst :: (a, b) -> a


型クラス

型クラスは振る舞いを定めたインターフェースを提供し、IntやCharなどの各インスタンスは複数の型クラス(インターフェース)を持つことができる。

ghci> :t (==)
(==) :: Eq a => a -> a -> Bool

この例では、関数==はEq型クラスのインスタンスaを2つ受け取りBool型を返すという関数型と読める。=>の左側に型クラス制約を定義する。

ある関数にEqクラスの制約がついていれば、関数内のどこかで等値性の比較が行われている。ということが読める。


Ordクラス

順序付けのためのクラス。関数を除くすべての型がOrdのインスタンスとなる。

ghci> :t (>)
(>) :: Ord a => a -> a -> Bool
ghci> 5 > 2
True


Showクラス

文字列として表現可能にする型クラス。関数を除くすべての型はShowクラスのインスタンスとなる。show関数は与えられた引数を文字列として表示する。

ghci> :t show
show :: Show a => a -> String
ghci> show 1
"1"
ghci> show [1,2]
"[1,2]"


Readクラス

文字列を他の型として表現可能にする型クラス。

Read型クラスのインスタンスは具体的にどの型かを判別する為、推論する式や型注釈:: Intなどを与える必要がある。

ghci> :t read
read :: Read a => String -> a
ghci> read "8" + 2
10
ghci> read "8" :: Int
8
ghci> read "[1,2]" :: [Int]
[1,2]


Enumクラス

順序付けができるインスタンス(IntやChar)が持つ型クラス。列挙したり前後関係を取得したりできる。

ghci> :t succ
succ :: Enum a => a -> a
ghci> succ 10
11
ghci> ['a'..'d']
"abcd"


Boundedクラス

上限、下限を持つ型クラス。

ghci> :t minBound 
minBound :: Bounded a => a
ghci> minBound ::Int
-9223372036854775808
Numクラス

数値のように振舞う。

ghci> :t (*)
(*) :: Num a => a -> a -> a
Floatingクラス

浮動少数点数に使う型クラス。

Integral

整数値のみ。

Maybe型

正確にはMaybeのみを指す場合は型コンストラクタと呼ぶ。Maybe IntMaybe Charと型引数を加えてMaybe型となる。

Maybe型はList型のようにある型を包む型となる。

Maybe aとした場合、任意型aが0個または1つを持てる型となる。他言語のOption(al)型のようなもの。

0個の場合は関数Nothingが、1個の場合はJust a関数がMaybe型を返す。