Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

3,992 views

Published on

  • Be the first to comment

すごい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)

×