Haskell   タイプ

ホーム   目次


この章では、Haskellの型 (type) を説明しています。

型シノニム

文字列は文字のリストです。文字列を表す 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 のインスタンス同士を比較するという意味になります。

組み込み型クラス

deriving 宣言

自分で定義した型に、既存の型クラスのメソッドを追加するには「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

Maybe モナド

Prelude> :t Nothing
Nothing :: Maybe a
Prelude> :t Just 1
Just 1 :: Num a => Maybe a

IO モナド

Prelude> :t putStr
putStr :: String -> IO ()


12767 visits
Posted: Jan. 22, 2019
Update: Jan. 22, 2019

ホーム   目次   ページトップ