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

3,278 views
3,003 views

Published on

0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,278
On SlideShare
0
From Embeds
0
Number of Embeds
64
Actions
Shares
0
Downloads
5
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

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

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

×