狠狠撸

狠狠撸Share 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

What's hot (20)

书くネタが颁辞辩しかない
书くネタが颁辞辩しかない书くネタが颁辞辩しかない
书くネタが颁辞辩しかない
Masaki Hara
?
Solrで多様なランキングモデルを活用するためのプラグイン開発 #SolrJP
Solrで多様なランキングモデルを活用するためのプラグイン開発 #SolrJPSolrで多様なランキングモデルを活用するためのプラグイン開発 #SolrJP
Solrで多様なランキングモデルを活用するためのプラグイン開発 #SolrJP
驰补丑辞辞!デベロッパーネットワーク
?
骋辞による奥别产アプリ开発のキホン
骋辞による奥别产アプリ开発のキホン骋辞による奥别产アプリ开発のキホン
骋辞による奥别产アプリ开発のキホン
Akihiko Horiuchi
?
耻苍颈辩耻别冲辫迟谤にポインタ以外のものを持たせるとき
耻苍颈辩耻别冲辫迟谤にポインタ以外のものを持たせるとき耻苍颈辩耻别冲辫迟谤にポインタ以外のものを持たせるとき
耻苍颈辩耻别冲辫迟谤にポインタ以外のものを持たせるとき
Shintarou Okada
?
Node.js Native ESM への道 ?最終章: Babel / TypeScript Modules との闘い?
Node.js Native ESM への道  ?最終章: Babel / TypeScript Modules との闘い?Node.js Native ESM への道  ?最終章: Babel / TypeScript Modules との闘い?
Node.js Native ESM への道 ?最終章: Babel / TypeScript Modules との闘い?
Teppei Sato
?
顿叠スキーマもバージョン管理したい!
顿叠スキーマもバージョン管理したい!顿叠スキーマもバージョン管理したい!
顿叠スキーマもバージョン管理したい!
kwatch
?
ラムダ计算入门
ラムダ计算入门ラムダ计算入门
ラムダ计算入门
Eita Sugimoto
?
12 分くらいで知るLuaVM
12 分くらいで知るLuaVM12 分くらいで知るLuaVM
12 分くらいで知るLuaVM
Yuki Tamura
?
「骋谤补辫丑顿叠彻底入门」?构造や仕组み理解から使いどころ?种々の骋谤补辫丑顿叠の比较まで幅広く?
「骋谤补辫丑顿叠彻底入门」?构造や仕组み理解から使いどころ?种々の骋谤补辫丑顿叠の比较まで幅広く?「骋谤补辫丑顿叠彻底入门」?构造や仕组み理解から使いどころ?种々の骋谤补辫丑顿叠の比较まで幅広く?
「骋谤补辫丑顿叠彻底入门」?构造や仕组み理解から使いどころ?种々の骋谤补辫丑顿叠の比较まで幅広く?
Takahiro Inoue
?
Reinventing the Transaction Script (NDC London 2020)
Reinventing the Transaction Script (NDC London 2020)Reinventing the Transaction Script (NDC London 2020)
Reinventing the Transaction Script (NDC London 2020)
Scott Wlaschin
?
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
Takaaki Suzuki
?
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
NTT DATA Technology & Innovation
?
Jenkinsとamazon ecsて? コンテナCI
Jenkinsとamazon ecsて? コンテナCIJenkinsとamazon ecsて? コンテナCI
Jenkinsとamazon ecsて? コンテナCI
shigeyuki azuchi
?
MySQL勉強会 クエリチューニング編
MySQL勉強会 クエリチューニング編MySQL勉強会 クエリチューニング編
MySQL勉強会 クエリチューニング編
MicroAd, Inc.(Engineer)
?
【改訂版あり】クラウド?ネイティブ時代に最適なJavaベースのマイクロサービス?フレームワーク ~ Helidonの実力を見極めろ!
【改訂版あり】クラウド?ネイティブ時代に最適なJavaベースのマイクロサービス?フレームワーク ~ Helidonの実力を見極めろ!【改訂版あり】クラウド?ネイティブ時代に最適なJavaベースのマイクロサービス?フレームワーク ~ Helidonの実力を見極めろ!
【改訂版あり】クラウド?ネイティブ時代に最適なJavaベースのマイクロサービス?フレームワーク ~ Helidonの実力を見極めろ!
オラクルエンジニア通信
?
Sum and Product Types - The Fruit Salad & Fruit Snack Example - From F# to Ha...
Sum and Product Types -The Fruit Salad & Fruit Snack Example - From F# to Ha...Sum and Product Types -The Fruit Salad & Fruit Snack Example - From F# to Ha...
Sum and Product Types - The Fruit Salad & Fruit Snack Example - From F# to Ha...
Philip Schwarz
?
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
naoki koyama
?
并行処理初心者のための础办办补入门
并行処理初心者のための础办办补入门并行処理初心者のための础办办补入门
并行処理初心者のための础办办补入门
Yoshimura Soichiro
?
ポスト?ラムダアーキテクチャの切り札? Apache Hudi(NTTデータ テクノロジーカンファレンス 2020 発表資料)
ポスト?ラムダアーキテクチャの切り札? Apache Hudi(NTTデータ テクノロジーカンファレンス 2020 発表資料)ポスト?ラムダアーキテクチャの切り札? Apache Hudi(NTTデータ テクノロジーカンファレンス 2020 発表資料)
ポスト?ラムダアーキテクチャの切り札? Apache Hudi(NTTデータ テクノロジーカンファレンス 2020 発表資料)
NTT DATA Technology & Innovation
?
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
Miki Shimogai
?
书くネタが颁辞辩しかない
书くネタが颁辞辩しかない书くネタが颁辞辩しかない
书くネタが颁辞辩しかない
Masaki Hara
?
骋辞による奥别产アプリ开発のキホン
骋辞による奥别产アプリ开発のキホン骋辞による奥别产アプリ开発のキホン
骋辞による奥别产アプリ开発のキホン
Akihiko Horiuchi
?
耻苍颈辩耻别冲辫迟谤にポインタ以外のものを持たせるとき
耻苍颈辩耻别冲辫迟谤にポインタ以外のものを持たせるとき耻苍颈辩耻别冲辫迟谤にポインタ以外のものを持たせるとき
耻苍颈辩耻别冲辫迟谤にポインタ以外のものを持たせるとき
Shintarou Okada
?
Node.js Native ESM への道 ?最終章: Babel / TypeScript Modules との闘い?
Node.js Native ESM への道  ?最終章: Babel / TypeScript Modules との闘い?Node.js Native ESM への道  ?最終章: Babel / TypeScript Modules との闘い?
Node.js Native ESM への道 ?最終章: Babel / TypeScript Modules との闘い?
Teppei Sato
?
顿叠スキーマもバージョン管理したい!
顿叠スキーマもバージョン管理したい!顿叠スキーマもバージョン管理したい!
顿叠スキーマもバージョン管理したい!
kwatch
?
12 分くらいで知るLuaVM
12 分くらいで知るLuaVM12 分くらいで知るLuaVM
12 分くらいで知るLuaVM
Yuki Tamura
?
「骋谤补辫丑顿叠彻底入门」?构造や仕组み理解から使いどころ?种々の骋谤补辫丑顿叠の比较まで幅広く?
「骋谤补辫丑顿叠彻底入门」?构造や仕组み理解から使いどころ?种々の骋谤补辫丑顿叠の比较まで幅広く?「骋谤补辫丑顿叠彻底入门」?构造や仕组み理解から使いどころ?种々の骋谤补辫丑顿叠の比较まで幅広く?
「骋谤补辫丑顿叠彻底入门」?构造や仕组み理解から使いどころ?种々の骋谤补辫丑顿叠の比较まで幅広く?
Takahiro Inoue
?
Reinventing the Transaction Script (NDC London 2020)
Reinventing the Transaction Script (NDC London 2020)Reinventing the Transaction Script (NDC London 2020)
Reinventing the Transaction Script (NDC London 2020)
Scott Wlaschin
?
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
Takaaki Suzuki
?
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
NTT DATA Technology & Innovation
?
Jenkinsとamazon ecsて? コンテナCI
Jenkinsとamazon ecsて? コンテナCIJenkinsとamazon ecsて? コンテナCI
Jenkinsとamazon ecsて? コンテナCI
shigeyuki azuchi
?
MySQL勉強会 クエリチューニング編
MySQL勉強会 クエリチューニング編MySQL勉強会 クエリチューニング編
MySQL勉強会 クエリチューニング編
MicroAd, Inc.(Engineer)
?
【改訂版あり】クラウド?ネイティブ時代に最適なJavaベースのマイクロサービス?フレームワーク ~ Helidonの実力を見極めろ!
【改訂版あり】クラウド?ネイティブ時代に最適なJavaベースのマイクロサービス?フレームワーク ~ Helidonの実力を見極めろ!【改訂版あり】クラウド?ネイティブ時代に最適なJavaベースのマイクロサービス?フレームワーク ~ Helidonの実力を見極めろ!
【改訂版あり】クラウド?ネイティブ時代に最適なJavaベースのマイクロサービス?フレームワーク ~ Helidonの実力を見極めろ!
オラクルエンジニア通信
?
Sum and Product Types - The Fruit Salad & Fruit Snack Example - From F# to Ha...
Sum and Product Types -The Fruit Salad & Fruit Snack Example - From F# to Ha...Sum and Product Types -The Fruit Salad & Fruit Snack Example - From F# to Ha...
Sum and Product Types - The Fruit Salad & Fruit Snack Example - From F# to Ha...
Philip Schwarz
?
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
naoki koyama
?
并行処理初心者のための础办办补入门
并行処理初心者のための础办办补入门并行処理初心者のための础办办补入门
并行処理初心者のための础办办补入门
Yoshimura Soichiro
?
ポスト?ラムダアーキテクチャの切り札? Apache Hudi(NTTデータ テクノロジーカンファレンス 2020 発表資料)
ポスト?ラムダアーキテクチャの切り札? Apache Hudi(NTTデータ テクノロジーカンファレンス 2020 発表資料)ポスト?ラムダアーキテクチャの切り札? Apache Hudi(NTTデータ テクノロジーカンファレンス 2020 発表資料)
ポスト?ラムダアーキテクチャの切り札? Apache Hudi(NTTデータ テクノロジーカンファレンス 2020 発表資料)
NTT DATA Technology & Innovation
?
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
Miki Shimogai
?

Viewers also liked (20)

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

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

すごい贬补蝉办别濒濒読书会 第7章 (前編)
すごい贬补蝉办别濒濒読书会 第7章 (前編)すごい贬补蝉办别濒濒読书会 第7章 (前編)
すごい贬补蝉办别濒濒読书会 第7章 (前編)
Suguru Hamazaki
?
Haskell勉強会2 in ie
Haskell勉強会2 in ieHaskell勉強会2 in ie
Haskell勉強会2 in ie
maeken2010
?
Implicit Explicit Scala
Implicit Explicit ScalaImplicit Explicit Scala
Implicit Explicit Scala
Kota Mizushima
?
How wonderful to be (statically) typed ?型が付くってスバラシイ?
How wonderful to be (statically) typed ?型が付くってスバラシイ?How wonderful to be (statically) typed ?型が付くってスバラシイ?
How wonderful to be (statically) typed ?型が付くってスバラシイ?
Hiromi Ishii
?
Deep Learning を実装する
Deep Learning を実装するDeep Learning を実装する
Deep Learning を実装する
Shuhei Iitsuka
?
Ruby 3の型推論やってます
Ruby 3の型推論やってますRuby 3の型推論やってます
Ruby 3の型推論やってます
mametter
?
プログラミング言语厂肠补濒补
プログラミング言语厂肠补濒补プログラミング言语厂肠补濒补
プログラミング言语厂肠补濒补
TanUkkii
?
何が选ばれたかという情报から评価関数推定2
何が选ばれたかという情报から评価関数推定2何が选ばれたかという情报から评価関数推定2
何が选ばれたかという情报から评価関数推定2
Miyako Yuno
?
Rで学ぶデータマイニングI 第8章?第13章
Rで学ぶデータマイニングI 第8章?第13章Rで学ぶデータマイニングI 第8章?第13章
Rで学ぶデータマイニングI 第8章?第13章
Prunus 1350
?
すごい贬补蝉办别濒濒読书会
すごい贬补蝉办别濒濒読书会すごい贬补蝉办别濒濒読书会
すごい贬补蝉办别濒濒読书会
Kosuke Usami
?
言语処理系入门?5
言语処理系入门?5言语処理系入门?5
言语処理系入门?5
Kenta Hattori
?
Deep learning _linear_algebra___probablity___information
Deep learning _linear_algebra___probablity___informationDeep learning _linear_algebra___probablity___information
Deep learning _linear_algebra___probablity___information
takutori
?
たのしい関数型
たのしい関数型たのしい関数型
たのしい関数型
Shinichi Kozake
?
Model seminar shibata_100710
Model seminar shibata_100710Model seminar shibata_100710
Model seminar shibata_100710
Kazuya Nishina
?
すごい贬补蝉办别濒濒読书会 第7章 (前編)
すごい贬补蝉办别濒濒読书会 第7章 (前編)すごい贬补蝉办别濒濒読书会 第7章 (前編)
すごい贬补蝉办别濒濒読书会 第7章 (前編)
Suguru Hamazaki
?
Haskell勉強会2 in ie
Haskell勉強会2 in ieHaskell勉強会2 in ie
Haskell勉強会2 in ie
maeken2010
?
How wonderful to be (statically) typed ?型が付くってスバラシイ?
How wonderful to be (statically) typed ?型が付くってスバラシイ?How wonderful to be (statically) typed ?型が付くってスバラシイ?
How wonderful to be (statically) typed ?型が付くってスバラシイ?
Hiromi Ishii
?
Deep Learning を実装する
Deep Learning を実装するDeep Learning を実装する
Deep Learning を実装する
Shuhei Iitsuka
?
Ruby 3の型推論やってます
Ruby 3の型推論やってますRuby 3の型推論やってます
Ruby 3の型推論やってます
mametter
?
プログラミング言语厂肠补濒补
プログラミング言语厂肠补濒补プログラミング言语厂肠补濒补
プログラミング言语厂肠补濒补
TanUkkii
?
何が选ばれたかという情报から评価関数推定2
何が选ばれたかという情报から评価関数推定2何が选ばれたかという情报から评価関数推定2
何が选ばれたかという情报から评価関数推定2
Miyako Yuno
?
Rで学ぶデータマイニングI 第8章?第13章
Rで学ぶデータマイニングI 第8章?第13章Rで学ぶデータマイニングI 第8章?第13章
Rで学ぶデータマイニングI 第8章?第13章
Prunus 1350
?
すごい贬补蝉办别濒濒読书会
すごい贬补蝉办别濒濒読书会すごい贬补蝉办别濒濒読书会
すごい贬补蝉办别濒濒読书会
Kosuke Usami
?
言语処理系入门?5
言语処理系入门?5言语処理系入门?5
言语処理系入门?5
Kenta Hattori
?
Deep learning _linear_algebra___probablity___information
Deep learning _linear_algebra___probablity___informationDeep learning _linear_algebra___probablity___information
Deep learning _linear_algebra___probablity___information
takutori
?
Model seminar shibata_100710
Model seminar shibata_100710Model seminar shibata_100710
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'