第7章 型や型クラスを自
分で作ろう(前編)
「すごいHaskell」 pp. 111-151
用語
●   値コンストラクタ = データ型の値を返す関数
●   型コンストラクタ = 型を引数に取って具体型を返す
●   型引数 = 型コンストラクタに対する引数 (通常の型)
●   具体型 = 型引数を一つも取らないか、すべての型引数が埋
    まっている型
●   多相型 = 型引数を持つ型
データ型の定義
data Bool = False | True deriving (Ord)

data Day = Monday | Tuesday | Wednesday | Thursday |
Friday | Saturday | Sunday
    deriving (Eq, Ord, Show, Read, Bounded, Enum)
データ型の定義 (2)
data Point = Point Float Float deriving (Show)
data Shape = Circle Point Float | Rectangle Point Point
   deriving (Show)

area (Circle _ r) = pi * r ^ 2
area (Rectangle (Point x1 y1) (Point x2 y2))
  = (abs $ x2 - x1) * (abs $ y2 - y1)

                 左辺の Point はデータ型
               右辺の Point は値コンストラクタ
               値コンストラクタは引数を取れる
レコード構文
data Car = Car {
   company :: String,
   model :: String,
   year :: Int
   } deriving (Eq, Show)

car = Car {company="Ford", model="Mustang", year=1967}
型引数と型コンストラクタ
data Maybe a = Nothing | Just a

data Either a b = Left a | Right b
   deriving (Eq, Ord, Read, Show)




               この例の a や b が型引数
            Maybe や Either が型コンストラクタ
型シノニム (エイリアス)
type String = [Char]

type PhoneNumber = String
type Name = String
type PhoneBook = [(Name, PhoneNumber)]

type AssocList k v = [(k, v)]



              新しい型を定義するわけではない
             最後の式は多相的な型シノニムの例
代表的な型クラス
●   Eq = 等価性テストができる
●   Ord = 大小比較ができる
●   Enum = 前後の値を取得できる, 範囲を指定できる
●   Bounded = 上限と下限を持つ
●   Show = 表示できる
●   Read = 読み取れる
型のエクスポート
module Shape (
   Point(..),
   Shape(..),
   area
) where




       (..) を付けると値コンストラクタが公開される
       値コンストラクタを隠蔽すると抽象度が上がる
型クラス制約
data Vector a = Vector a a a deriving (Show)

vplus :: (Num a) => Vector a -> Vector a -> Vector a
dotProd :: (Num a) => Vector a -> Vector a -> a
vmult :: (Num a) => Vector a -> a -> Vector a




        データ宣言には型クラス制約を付けない規約
再帰的なデータ型
data Tree a = EmptyTree | Node a (Tree a) (Tree a)
   deriving (Show)

singleton :: a -> Tree a
treeElem :: (Ord a) => a -> Tree a -> Bool
再帰的なデータ型 (2)
infixr 5 :-:
data List a = Empty | a :-: (List a)
    deriving (Eq, Ord, Show, Read)

infixr 5 ^++
(^++) :: [a] -> [a] -> [a]
Empty ^++ ys = ys
(x :-: xs) ^++ ys = x :-: (xs ^++ ys)
型クラスの定義
class Eq a where
   (==) :: a -> a -> Bool
   (/=) :: a -> a -> Bool
   ...

class (Eq a) => Num a where
   ...
インスタンスの手動導出
data TrafficLight = Red | Yellow | Green

instance Show TrafficLight where
    ...

instance Eq (Maybe m) where
    (Just x == Just y) = (x == y)
    (Nothing == Nothing) = True
    (_ == _) = False
型の調べ方
Prelude> :info Bool
data Bool = False | True -- Defined in `GHC.Types'
instance Bounded Bool -- Defined in `GHC.Enum'
instance Enum Bool -- Defined in `GHC.Enum'
instance Eq Bool -- Defined in `GHC.Classes'
instance Ord Bool -- Defined in `GHC.Classes'
instance Read Bool -- Defined in `GHC.Read'
instance Show Bool -- Defined in `GHC.Show'
型クラスの調べ方
Prelude> :info Num
class Num a where
     (+) :: a -> a -> a
     (*) :: a -> a -> a
     (-) :: a -> a -> a
     negate :: a -> a
     abs :: a -> a
     signum :: a -> a
     fromInteger :: Integer -> a
      -- Defined in `GHC.Num'
instance Num Integer -- Defined in `GHC.Num'
instance Num Int -- Defined in `GHC.Num'
instance Num Float -- Defined in `GHC.Float'
instance Num Double -- Defined in `GHC.Float'
以下次回
● Functor型クラス
● 種類 (kind)

すごいHaskell 第7章 型や型クラスを自分で作ろう(前編)

  • 1.
  • 2.
    用語 ● 値コンストラクタ = データ型の値を返す関数 ● 型コンストラクタ = 型を引数に取って具体型を返す ● 型引数 = 型コンストラクタに対する引数 (通常の型) ● 具体型 = 型引数を一つも取らないか、すべての型引数が埋 まっている型 ● 多相型 = 型引数を持つ型
  • 3.
    データ型の定義 data Bool =False | True deriving (Ord) data Day = Monday | Tuesday | Wednesday | Thursday | Friday | Saturday | Sunday deriving (Eq, Ord, Show, Read, Bounded, Enum)
  • 4.
    データ型の定義 (2) data Point= Point Float Float deriving (Show) data Shape = Circle Point Float | Rectangle Point Point deriving (Show) area (Circle _ r) = pi * r ^ 2 area (Rectangle (Point x1 y1) (Point x2 y2)) = (abs $ x2 - x1) * (abs $ y2 - y1) 左辺の Point はデータ型 右辺の Point は値コンストラクタ 値コンストラクタは引数を取れる
  • 5.
    レコード構文 data Car =Car { company :: String, model :: String, year :: Int } deriving (Eq, Show) car = Car {company="Ford", model="Mustang", year=1967}
  • 6.
    型引数と型コンストラクタ data Maybe a= Nothing | Just a data Either a b = Left a | Right b deriving (Eq, Ord, Read, Show) この例の a や b が型引数 Maybe や Either が型コンストラクタ
  • 7.
    型シノニム (エイリアス) type String= [Char] type PhoneNumber = String type Name = String type PhoneBook = [(Name, PhoneNumber)] type AssocList k v = [(k, v)] 新しい型を定義するわけではない 最後の式は多相的な型シノニムの例
  • 8.
    代表的な型クラス ● Eq = 等価性テストができる ● Ord = 大小比較ができる ● Enum = 前後の値を取得できる, 範囲を指定できる ● Bounded = 上限と下限を持つ ● Show = 表示できる ● Read = 読み取れる
  • 9.
    型のエクスポート module Shape ( Point(..), Shape(..), area ) where (..) を付けると値コンストラクタが公開される 値コンストラクタを隠蔽すると抽象度が上がる
  • 10.
    型クラス制約 data Vector a= Vector a a a deriving (Show) vplus :: (Num a) => Vector a -> Vector a -> Vector a dotProd :: (Num a) => Vector a -> Vector a -> a vmult :: (Num a) => Vector a -> a -> Vector a データ宣言には型クラス制約を付けない規約
  • 11.
    再帰的なデータ型 data Tree a= EmptyTree | Node a (Tree a) (Tree a) deriving (Show) singleton :: a -> Tree a treeElem :: (Ord a) => a -> Tree a -> Bool
  • 12.
    再帰的なデータ型 (2) infixr 5:-: data List a = Empty | a :-: (List a) deriving (Eq, Ord, Show, Read) infixr 5 ^++ (^++) :: [a] -> [a] -> [a] Empty ^++ ys = ys (x :-: xs) ^++ ys = x :-: (xs ^++ ys)
  • 13.
    型クラスの定義 class Eq awhere (==) :: a -> a -> Bool (/=) :: a -> a -> Bool ... class (Eq a) => Num a where ...
  • 14.
    インスタンスの手動導出 data TrafficLight =Red | Yellow | Green instance Show TrafficLight where ... instance Eq (Maybe m) where (Just x == Just y) = (x == y) (Nothing == Nothing) = True (_ == _) = False
  • 15.
    型の調べ方 Prelude> :info Bool dataBool = False | True -- Defined in `GHC.Types' instance Bounded Bool -- Defined in `GHC.Enum' instance Enum Bool -- Defined in `GHC.Enum' instance Eq Bool -- Defined in `GHC.Classes' instance Ord Bool -- Defined in `GHC.Classes' instance Read Bool -- Defined in `GHC.Read' instance Show Bool -- Defined in `GHC.Show'
  • 16.
    型クラスの調べ方 Prelude> :info Num classNum a where (+) :: a -> a -> a (*) :: a -> a -> a (-) :: a -> a -> a negate :: a -> a abs :: a -> a signum :: a -> a fromInteger :: Integer -> a -- Defined in `GHC.Num' instance Num Integer -- Defined in `GHC.Num' instance Num Int -- Defined in `GHC.Num' instance Num Float -- Defined in `GHC.Float' instance Num Double -- Defined in `GHC.Float'
  • 17.