この章では、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 ()