すごい haskell 読書会 in 大阪 #5
DESCRIPTION
http://atnd.org/events/36770TRANSCRIPT
![Page 1: すごい Haskell 読書会 in 大阪 #5](https://reader034.vdocuments.mx/reader034/viewer/2022052409/53ffe1438d7f7249088b4752/html5/thumbnails/1.jpg)
すごい Haskell 読書会 in 大阪
#5
岡本和樹
@kakkun61
![Page 2: すごい Haskell 読書会 in 大阪 #5](https://reader034.vdocuments.mx/reader034/viewer/2022052409/53ffe1438d7f7249088b4752/html5/thumbnails/2.jpg)
7.1 新しいデータ型を定義する
• data Bool = True | False
• data 型 = 値コンストラクター
![Page 3: すごい Haskell 読書会 in 大阪 #5](https://reader034.vdocuments.mx/reader034/viewer/2022052409/53ffe1438d7f7249088b4752/html5/thumbnails/3.jpg)
7.2 形づくる
• 円
– x座標
– y座標
–半径
• 四角形
–左上x座標
–左上y座標
–右下x座標
–右下y座標
![Page 4: すごい Haskell 読書会 in 大阪 #5](https://reader034.vdocuments.mx/reader034/viewer/2022052409/53ffe1438d7f7249088b4752/html5/thumbnails/4.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052409/53ffe1438d7f7249088b4752/html5/thumbnails/5.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052409/53ffe1438d7f7249088b4752/html5/thumbnails/6.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052409/53ffe1438d7f7249088b4752/html5/thumbnails/7.jpg)
7.3 レコード構文
• data Car = Car String String Int deriving (Show)
• Car "Ford" "Mustang" 1967
![Page 8: すごい Haskell 読書会 in 大阪 #5](https://reader034.vdocuments.mx/reader034/viewer/2022052409/53ffe1438d7f7249088b4752/html5/thumbnails/8.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052409/53ffe1438d7f7249088b4752/html5/thumbnails/9.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052409/53ffe1438d7f7249088b4752/html5/thumbnails/10.jpg)
7.4 型引数
• data Maybe a = Nothing | Just a
• Just “Hay” :: Maybe String
• [1..10] :: [Int]
• [“learn”, “Haskell”] :: [String]
![Page 11: すごい Haskell 読書会 in 大阪 #5](https://reader034.vdocuments.mx/reader034/viewer/2022052409/53ffe1438d7f7249088b4752/html5/thumbnails/11.jpg)
7.4 型引数
• Map k v
• data (Ord k) => Map k v ...
• データ宣言には決して型クラス制約をつけない
• Map.toList :: Map k v -> [(k, v)]
![Page 12: すごい Haskell 読書会 in 大阪 #5](https://reader034.vdocuments.mx/reader034/viewer/2022052409/53ffe1438d7f7249088b4752/html5/thumbnails/12.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052409/53ffe1438d7f7249088b4752/html5/thumbnails/13.jpg)
7.5 インスタンスの自動導出
• data Person = Person { firstName :: String , lastName :: String , age :: Int } deriving (Eq)
![Page 14: すごい Haskell 読書会 in 大阪 #5](https://reader034.vdocuments.mx/reader034/viewer/2022052409/53ffe1438d7f7249088b4752/html5/thumbnails/14.jpg)
7.5 インスタンスの自動導出
• deriving (Eq, Show, Read)
• show :: Person -> String
• read :: String -> Person
![Page 15: すごい Haskell 読書会 in 大阪 #5](https://reader034.vdocuments.mx/reader034/viewer/2022052409/53ffe1438d7f7249088b4752/html5/thumbnails/15.jpg)
7.5 インスタンスの自動導出
• ghci> read "Person {firstName =¥"Michael¥", lastName =¥"Diamond¥", age = 43}" :: Person
• Person {firstName = "Michael", lastName = "Diamond", age = 43}
![Page 16: すごい Haskell 読書会 in 大阪 #5](https://reader034.vdocuments.mx/reader034/viewer/2022052409/53ffe1438d7f7249088b4752/html5/thumbnails/16.jpg)
7.5 インスタンスの自動導出
• data Bool = False | True deriving (Ord)
• ghci> True `compare` False
• GT
• ghci> False < True
• True
![Page 17: すごい Haskell 読書会 in 大阪 #5](https://reader034.vdocuments.mx/reader034/viewer/2022052409/53ffe1438d7f7249088b4752/html5/thumbnails/17.jpg)
7.5 インスタンスの自動導出
• data Day = Monday | Tuesday | Wednesday | Thursday | Friday | Saturday | Sunday deriving ( Eq, Ord, Show, Read , Bounded, Enum)
![Page 18: すごい Haskell 読書会 in 大阪 #5](https://reader034.vdocuments.mx/reader034/viewer/2022052409/53ffe1438d7f7249088b4752/html5/thumbnails/18.jpg)
7.5 インスタンスの自動導出
• Bounded クラス
• ghci> minBound :: Day
• Monday
• ghci> maxBound :: Day
• Sunday
![Page 19: すごい Haskell 読書会 in 大阪 #5](https://reader034.vdocuments.mx/reader034/viewer/2022052409/53ffe1438d7f7249088b4752/html5/thumbnails/19.jpg)
7.5 インスタンスの自動導出
• Enum クラス
• ghci> succ Monday
• Tuesday
• ghci> pred Saturday
• Friday
• ghci> [Thursday .. Sunday]
• [Thursday,Friday,Saturday,Sunday]
![Page 20: すごい Haskell 読書会 in 大阪 #5](https://reader034.vdocuments.mx/reader034/viewer/2022052409/53ffe1438d7f7249088b4752/html5/thumbnails/20.jpg)
7.6 型シノニム
• type String = [Char]
• type AssocList k v = [(k, v)]
• data Either a b = Left a | Right b deriving (Eq, Ord, Read, Show)