SlideShare a Scribd company logo
第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)

More Related Content

PDF
C#でもメタプログラミングがしたい!!
TATSUYA HAYAMIZU
 
PDF
オブジェクト指向できていますか?
Moriharu Ohzu
 
PDF
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
増田 亨
 
PDF
今から始める Lens/Prism
Naoki Aoyama
 
PPTX
JVMに裏から手を出す!JVMTIに触れてみよう(オープンソースカンファレンス2020 Online/Hiroshima 講演資料)
NTT DATA Technology & Innovation
 
PDF
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Chihiro Ito
 
PDF
If文から機械学習への道
nishio
 
PPTX
C#を始めたばかりの人へのLINQ to Objects
Fumitaka Yamada
 
C#でもメタプログラミングがしたい!!
TATSUYA HAYAMIZU
 
オブジェクト指向できていますか?
Moriharu Ohzu
 
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
増田 亨
 
今から始める Lens/Prism
Naoki Aoyama
 
JVMに裏から手を出す!JVMTIに触れてみよう(オープンソースカンファレンス2020 Online/Hiroshima 講演資料)
NTT DATA Technology & Innovation
 
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Chihiro Ito
 
If文から機械学習への道
nishio
 
C#を始めたばかりの人へのLINQ to Objects
Fumitaka Yamada
 

What's hot (20)

PDF
できる!並列・並行プログラミング
Preferred Networks
 
PPTX
エラーハンドリング
道化師 堂華
 
PDF
Kotlinアンチパターン
Recruit Lifestyle Co., Ltd.
 
PPTX
Java 17直前!オレ流OpenJDK「の」開発環境(Open Source Conference 2021 Online/Kyoto 発表資料)
NTT DATA Technology & Innovation
 
PDF
ドメイン駆動設計 本格入門
増田 亨
 
PDF
モジュールの凝集度・結合度・インタフェース
Hajime Yanagawa
 
PDF
イミュータブルデータモデル(世代編)
Yoshitaka Kawashima
 
PDF
[DL輪読会]近年のエネルギーベースモデルの進展
Deep Learning JP
 
PDF
ドメインオブジェクトの見つけ方・作り方・育て方
増田 亨
 
PDF
Rustに触れて私のPythonはどう変わったか
ShunsukeNakamura17
 
PDF
SQL大量発行処理をいかにして高速化するか
Shogo Wakayama
 
PDF
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善
Ito Takayuki
 
PDF
ドメイン駆動設計 ( DDD ) をやってみよう
増田 亨
 
PDF
1-2-2 プラン・お支払い設定
freee株式会社
 
PDF
現場で役立つシステム設計の原則
増田 亨
 
PDF
【メタサーベイ】Transformerから基盤モデルまでの流れ / From Transformer to Foundation Models
cvpaper. challenge
 
PDF
Data-centricなML開発
Takeshi Suzuki
 
PDF
ユーザーストーリー・マッピング
Tarumoto Tetsuya
 
PDF
ASP.NETの進化とASP.NET Core Blazorの凄さ
Sho Okada
 
PDF
NumPyが物足りない人へのCython入門
Shiqiao Du
 
できる!並列・並行プログラミング
Preferred Networks
 
エラーハンドリング
道化師 堂華
 
Kotlinアンチパターン
Recruit Lifestyle Co., Ltd.
 
Java 17直前!オレ流OpenJDK「の」開発環境(Open Source Conference 2021 Online/Kyoto 発表資料)
NTT DATA Technology & Innovation
 
ドメイン駆動設計 本格入門
増田 亨
 
モジュールの凝集度・結合度・インタフェース
Hajime Yanagawa
 
イミュータブルデータモデル(世代編)
Yoshitaka Kawashima
 
[DL輪読会]近年のエネルギーベースモデルの進展
Deep Learning JP
 
ドメインオブジェクトの見つけ方・作り方・育て方
増田 亨
 
Rustに触れて私のPythonはどう変わったか
ShunsukeNakamura17
 
SQL大量発行処理をいかにして高速化するか
Shogo Wakayama
 
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善
Ito Takayuki
 
ドメイン駆動設計 ( DDD ) をやってみよう
増田 亨
 
1-2-2 プラン・お支払い設定
freee株式会社
 
現場で役立つシステム設計の原則
増田 亨
 
【メタサーベイ】Transformerから基盤モデルまでの流れ / From Transformer to Foundation Models
cvpaper. challenge
 
Data-centricなML開発
Takeshi Suzuki
 
ユーザーストーリー・マッピング
Tarumoto Tetsuya
 
ASP.NETの進化とASP.NET Core Blazorの凄さ
Sho Okada
 
NumPyが物足りない人へのCython入門
Shiqiao Du
 
Ad

Viewers also liked (20)

PDF
すごいHaskell 第7章 型や型クラスを自分で作ろう(後編)
Nozomu Kaneko
 
PDF
Monadなんてどうってことなかった話 - Monadなんてただの型クラス!
悠滋 山本
 
ODP
圏論 3分(?) クッキング
aiya000
 
KEY
Programming haskell chapter10
Kousuke Ruichi
 
PDF
Hello Girl's World!!@女子エンジニアLT会 #dotsgirls
Hikari Fukasawa
 
PDF
Scalaで型クラス入門
Makoto Fukuhara
 
PDF
Purescript with Monad
Kousuke Ruichi
 
PDF
MapR Hadoop M7 in CyberAgent AdTech Studio
Ken Takao
 
PDF
データファースト開発
Katsunori Kanda
 
PDF
How to work Tableau x Google Cloud Platform in CyberAgent AdTech Studio
Ken Takao
 
PDF
Inside CyberAgent's Game Development
Suguru Shirai
 
PDF
[db tech showcase Tokyo 2016] B15: サイバーエージェント アドテクスタジオの次世代データ分析基盤紹介 by 株式会社サイ...
Insight Technology, Inc.
 
PDF
広告におけるビッグデータの分析事例
Ken Takao
 
PDF
Amebaにおけるレコメンデーションシステムの紹介
cyberagent
 
PDF
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
infinite_loop
 
PDF
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
infinite_loop
 
PDF
CEDEC2013 ソーシャルゲームの開発現場でUXについて思いっきりあがいてみた1年間の話
Takahiro YAMAGUCHI
 
PPTX
データに振り回されて失敗した あんなことやこんなこと ~ゲームのために必要な本当の ビジネス・アナリティクス~
Daisuke Nogami
 
PDF
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
 
PDF
あなたのチームの「いい人」は機能していますか?
Minoru Yokomichi
 
すごいHaskell 第7章 型や型クラスを自分で作ろう(後編)
Nozomu Kaneko
 
Monadなんてどうってことなかった話 - Monadなんてただの型クラス!
悠滋 山本
 
圏論 3分(?) クッキング
aiya000
 
Programming haskell chapter10
Kousuke Ruichi
 
Hello Girl's World!!@女子エンジニアLT会 #dotsgirls
Hikari Fukasawa
 
Scalaで型クラス入門
Makoto Fukuhara
 
Purescript with Monad
Kousuke Ruichi
 
MapR Hadoop M7 in CyberAgent AdTech Studio
Ken Takao
 
データファースト開発
Katsunori Kanda
 
How to work Tableau x Google Cloud Platform in CyberAgent AdTech Studio
Ken Takao
 
Inside CyberAgent's Game Development
Suguru Shirai
 
[db tech showcase Tokyo 2016] B15: サイバーエージェント アドテクスタジオの次世代データ分析基盤紹介 by 株式会社サイ...
Insight Technology, Inc.
 
広告におけるビッグデータの分析事例
Ken Takao
 
Amebaにおけるレコメンデーションシステムの紹介
cyberagent
 
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
infinite_loop
 
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
infinite_loop
 
CEDEC2013 ソーシャルゲームの開発現場でUXについて思いっきりあがいてみた1年間の話
Takahiro YAMAGUCHI
 
データに振り回されて失敗した あんなことやこんなこと ~ゲームのために必要な本当の ビジネス・アナリティクス~
Daisuke Nogami
 
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
 
あなたのチームの「いい人」は機能していますか?
Minoru Yokomichi
 
Ad

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

PDF
すごいHaskell読書会 第7章 (前編)
Suguru Hamazaki
 
KEY
 
a-hisame
 
PDF
Haskell勉強会2 in ie
maeken2010
 
PDF
Implicit Explicit Scala
Kota Mizushima
 
PPT
Pythonintro
Mikio Kubo
 
KEY
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
Hiromi Ishii
 
PDF
Deep Learning を実装する
Shuhei Iitsuka
 
PDF
Ruby 3の型推論やってます
mametter
 
PDF
プログラミング言語Scala
TanUkkii
 
PDF
何が選ばれたかという情報から評価関数推定2
Miyako Yuno
 
PDF
BOF1-Scala02.pdf
Hiroshi Ono
 
PDF
BOF1-Scala02.pdf
Hiroshi Ono
 
PDF
BOF1-Scala02.pdf
Hiroshi Ono
 
PDF
Rで学ぶデータマイニングI 第8章〜第13章
Prunus 1350
 
PDF
すごいHaskell読書会
Kosuke Usami
 
PPT
言語処理系入門€5
Kenta Hattori
 
PDF
Deep learning _linear_algebra___probablity___information
takutori
 
PDF
NLPforml5
Hidekazu Oiwa
 
PDF
たのしい関数型
Shinichi Kozake
 
PPT
Model seminar shibata_100710
Kazuya Nishina
 
すごいHaskell読書会 第7章 (前編)
Suguru Hamazaki
 
Haskell勉強会2 in ie
maeken2010
 
Implicit Explicit Scala
Kota Mizushima
 
Pythonintro
Mikio Kubo
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
Hiromi Ishii
 
Deep Learning を実装する
Shuhei Iitsuka
 
Ruby 3の型推論やってます
mametter
 
プログラミング言語Scala
TanUkkii
 
何が選ばれたかという情報から評価関数推定2
Miyako Yuno
 
BOF1-Scala02.pdf
Hiroshi Ono
 
BOF1-Scala02.pdf
Hiroshi Ono
 
BOF1-Scala02.pdf
Hiroshi Ono
 
Rで学ぶデータマイニングI 第8章〜第13章
Prunus 1350
 
すごいHaskell読書会
Kosuke Usami
 
言語処理系入門€5
Kenta Hattori
 
Deep learning _linear_algebra___probablity___information
takutori
 
NLPforml5
Hidekazu Oiwa
 
たのしい関数型
Shinichi Kozake
 
Model seminar shibata_100710
Kazuya Nishina
 

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

  • 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 a where (==) :: 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 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'
  • 16. 型クラスの調べ方 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'