すごい haskell 読書会 in 大阪 #5

20
すごい Haskell 読書会 in 大阪 #5 岡本和樹 @kakkun61

Upload: kazkuki-oakamoto

Post on 29-Aug-2014

495 views

Category:

Documents


2 download

DESCRIPTION

http://atnd.org/events/36770

TRANSCRIPT

Page 1: すごい Haskell 読書会 in 大阪 #5

すごい Haskell 読書会 in 大阪

#5

岡本和樹

@kakkun61

Page 2: すごい Haskell 読書会 in 大阪 #5

7.1 新しいデータ型を定義する

• data Bool = True | False

• data 型 = 値コンストラクター

Page 3: すごい Haskell 読書会 in 大阪 #5

7.2 形づくる

• 円

– x座標

– y座標

–半径

• 四角形

–左上x座標

–左上y座標

–右下x座標

–右下y座標

Page 4: すごい Haskell 読書会 in 大阪 #5

7.2 形づくる

• data Shape = Circle Float Float Float | Rectangle Float Float Float Float

• Circle :: Float -> Float -> Float -> Shape

• Rectangle :: Float -> Float -> Float -> Float -> Shape

Page 5: すごい Haskell 読書会 in 大阪 #5

7.2 形づくる

• area :: Shape -> Float

• area (Circle _ _ r) = pi * r ^ 2

• area (Rectangle x1 y1 x2 y2) = (abs $ x1 - x2) * (abs $ y1 - y2)

Page 6: すごい Haskell 読書会 in 大阪 #5

7.2 形づくる

• data Point = Point Float Float deriving (Show)

• data Shape = Circle Point Float | Rectangle Point Point deriving (Show)

• area :: Shape -> Float

• area (Circle _ r) = pi * r ^ 2

• area (Rectangle (Point x1 y1) (Point x2 y2)) = …

Page 7: すごい Haskell 読書会 in 大阪 #5

7.3 レコード構文

• data Car = Car String String Int deriving (Show)

• Car "Ford" "Mustang" 1967

Page 8: すごい Haskell 読書会 in 大阪 #5

7.3 レコード構文

• data Car = Car String String Int deriving (Show)

• company :: Car -> String

• company (Car company _ _) = company

• model :: Car -> String

• model (Car _ model _) = model

• year :: Car -> Int

• year (Car _ _ year) = year

Page 9: すごい Haskell 読書会 in 大阪 #5

7.3 レコード構文

• data Car = Car { company :: String , model :: String , year :: Int } deriving (Show)

• Car {year = 1990, model = "Mark II", company = "Toyota"}

• Car "Ford" "Mustang" 1967

Page 10: すごい Haskell 読書会 in 大阪 #5

7.4 型引数

• data Maybe a = Nothing | Just a

• Just “Hay” :: Maybe String

• [1..10] :: [Int]

• [“learn”, “Haskell”] :: [String]

Page 11: すごい Haskell 読書会 in 大阪 #5

7.4 型引数

• Map k v

• data (Ord k) => Map k v ...

• データ宣言には決して型クラス制約をつけない

• Map.toList :: Map k v -> [(k, v)]

Page 12: すごい Haskell 読書会 in 大阪 #5

7.4 型引数

• data Vector a = Vector a a a deriving (Show)

• vplus :: (Num t) => Vector t -> Vector t -> Vector t

• (Vector i j k) `vplus` (Vector l m n) = Vector (i+l) (j+m) (k+n)

• vectMult :: (Num t) => Vector t -> t -> Vector t

• scalarMult :: (Num t) => Vector t -> Vector t -> t

Page 13: すごい Haskell 読書会 in 大阪 #5

7.5 インスタンスの自動導出

• data Person = Person { firstName :: String , lastName :: String , age :: Int } deriving (Eq)

Page 14: すごい Haskell 読書会 in 大阪 #5

7.5 インスタンスの自動導出

• deriving (Eq, Show, Read)

• show :: Person -> String

• read :: String -> Person

Page 15: すごい Haskell 読書会 in 大阪 #5

7.5 インスタンスの自動導出

• ghci> read "Person {firstName =¥"Michael¥", lastName =¥"Diamond¥", age = 43}" :: Person

• Person {firstName = "Michael", lastName = "Diamond", age = 43}

Page 16: すごい Haskell 読書会 in 大阪 #5

7.5 インスタンスの自動導出

• data Bool = False | True deriving (Ord)

• ghci> True `compare` False

• GT

• ghci> False < True

• True

Page 17: すごい Haskell 読書会 in 大阪 #5

7.5 インスタンスの自動導出

• data Day = Monday | Tuesday | Wednesday | Thursday | Friday | Saturday | Sunday deriving ( Eq, Ord, Show, Read , Bounded, Enum)

Page 18: すごい Haskell 読書会 in 大阪 #5

7.5 インスタンスの自動導出

• Bounded クラス

• ghci> minBound :: Day

• Monday

• ghci> maxBound :: Day

• Sunday

Page 19: すごい Haskell 読書会 in 大阪 #5

7.5 インスタンスの自動導出

• Enum クラス

• ghci> succ Monday

• Tuesday

• ghci> pred Saturday

• Friday

• ghci> [Thursday .. Sunday]

• [Thursday,Friday,Saturday,Sunday]

Page 20: すごい Haskell 読書会 in 大阪 #5

7.6 型シノニム

• type String = [Char]

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

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