読者です 読者をやめる 読者になる 読者になる

Hakellの型シグネチャを読む練習

Haskell

ひたすら読む。読めねばならぬ。ghciを起動し:tだ。

Prelude> :t 'h'
'h' :: Char

'h'は「Char型」。

Prelude> :t "hoge"
"hoge" :: [Char]

"hoge"は「Char型のリスト」である。

Prelude> :t (True, 'a')
(True, 'a') :: (Bool, Char)

(True, 'a')は「タプル(Bool, Char)型」である。

Prelude> :t 4 == 5
4 == 5 :: Bool

4 == 5は「Bool型」である。

Prelude> import Data.Char
Prelude Data.Char> :t toLower
toLower :: Char -> Char

toLowerは「Charを引数としCharを返す関数」である。

Prelude> :t map
map :: (a -> b) -> [a] -> [b]

a,bは型変数であり、どんな型も取り得る。シグネチャ内で一つの型変数は常に同じ型を取る。
mapは「aを受けbを返す関数と[a]型を引数とし、[b]型を返す関数」である。
(この()がタプルに見えるんだよな。)

Prelude> import Data.List
Prelude Data.List> :t sort
sort :: Ord a => [a] -> [a]

sortは「[a]型を引数とし[a]型を返す関数、ただしaは型クラスOrdのインスタンス」である。
ある型が型クラスの制約を満たすとき、その型は型クラスのインスタンスである、と言う。
Ordクラスの定義を覗くと

Prelude> :i Ord
class Eq a => Ord a where
  compare :: a -> a -> Ordering
  (<) :: a -> a -> Bool
  (<=) :: a -> a -> Bool
  (>) :: a -> a -> Bool
  (>=) :: a -> a -> Bool
  max :: a -> a -> a
  min :: a -> a -> a

compare,(<),(<=)...関数を実装しろという制約。Eqクラスを継承しているのでそちらの制約もある。

mapMの型シグネチャが読めなかったので今はここまで。