この章では、Haskellの型 (type) を説明しています。
Bool
真偽値Int
整数。最大値と最小値は機種に依存する限度があります。Integer
整数。最大値と最小値に限度はありません。Float
浮動小数点数Double
倍精度浮動小数点数Char
文字(
型1,
型2)
と記述します。
型1と型2は違う型でも構いません。[
型]
と記述します。::
型 ->
型と記述します。
文字列は文字のリストです。文字列を表す String
という型は、
型シノニムという方法で、文字のリスト [Char]
に String
という別名をつけています。
type String = [Char]
ghci に、「:t
データ」、と記述すると、そのデータの型が表示されます
Prelude> :t True
True :: Bool
Prelude> :t 1
1 :: Num t => t
上記で表示されている「Num
」
は型クラスと呼ばれるものです。
型クラスは、データ型を種類分けする概念です。
Num
という型クラスには、具体的な型である、Int、Integer、Float、Doubleが所属しています。型クラスに所属する具体的な型の事を、その型クラスの「インスタンス」と呼びます。
比較演算子 ==
で比較できるデータは、Eq
という型クラスのインスタンスです。具体的には、BoolとIntとFloatとChar、および、これらの型のタプルとリストです。そして、その型クラスで共有される関数や演算子は、その型クラスの「メソッド」と呼ばれます。比較演算子 ==
と /=
は、型クラス Eq のメソッドです。
==
という比較演算子の型を調べ見ると次のように表示されます。
Prelude> :t (==)
(==) :: Eq a => a -> a -> Bool
上記の中で「Eq a =>
」の部分を「型クラス制約」と呼びます。そして「a
」の部分を「型変数」と呼びます。
「(==) :: Eq a => a -> a -> Bool
」の意味は、演算子 ==
は、型クラス Eq
のインスタンス同士を比較するという意味になります。
Eq
==と/=
をメソッドとする型クラスOrd
>、<、>=<=
をメソッドとする型クラスEnum
列挙できる型をインスタンスとする
型クラスNum
数値の型を
インスタンスとする型クラスIntegral
整数の型をメソッドとする型クラスFloating
浮動小数点数の型をインスタンスとする型クラスBounded
上限と下限を持つ型をインスタンスとする型クラスShow
文字列に変換できる型を
インスタンスとする型クラスRead
文字列から変換できる型を
インスタンスとする型クラス自分で定義した型に、既存の型クラスのメソッドを追加するには「deriving 宣言」を使います。 例えば、Show 型クラスのメソッドを追加すれば標準出力に print できるようになります。
data Season = Spring | Summer | Autumn | Winter deriving Show
複数の型クラスのメソッド追加する場合は、括弧()
で囲んで、カンマ,
で区切ります。
data Season = Spring | Summer | Autumn | Winter deriving (Eq, Show)
型クラスは「型クラス定義」を書くことによってプログラマーが定義することができます。このようにプログラマーによって定義された型クラスを「ユーザー定義型クラス」と呼びます。
class Seasons a where
next :: a -> a
prev :: a -> a
data Season = Spring | Summer | Autumn | Winter deriving Show
上記の列挙型を Seasons 型クラスのインスタンスにするには次のよう記述します。
class Seasons a where
next :: a -> a
prev :: a -> a
data Season = Spring | Summer | Autumn | Winter deriving Show
instance Seasons Season where
next Spring = Summer
next Summer = Autumn
next Autumn = Winter
next Winter = Spring
prev Spring = Winter
prev Winter = Autumn
prev Autumn = Summer
prev Summer = Spring
Main> next Spring
Summer
*Main> prev Spring
Winter
Prelude> :t return 1
return 1 :: (Num a, Monad m) => m a
Prelude> :t Nothing
Nothing :: Maybe a
Prelude> :t Just 1
Just 1 :: Num a => Maybe a
Prelude> :t putStr
putStr :: String -> IO ()