SlideShare a Scribd company logo
1 of 9
Download to read offline
型クラス
HaskellとScalaの比較
Haskellの型クラス
class Num a where
add :: a -> a -> a
mul :: a -> a -> a
neg :: a -> a
instance Num Int where
add = addInt
mul = mulInt
neg = negInt
instance Num Float where
add = addFloat
mul = mulFloat
neg = negFloat
square :: Num a => a -> a
square x = mul x x
square 3
square 3.14
型クラスの変換
● Haskellの型クラスはコンパイル時にclassやinstanceがない形に変換することがで
きる
● 変換方法
○ 型クラス
■ 型クラスで列挙されている関数を持つ辞書型の定義
○ インスタンス
■ ↑で定義された型の値
Haskellの型クラス(変換後)
data NumD a = NumDict {
add :: a -> a -> a,
mul :: a -> a -> a,
neg :: a -> a
}
numDInt :: NumD Int
numDInt = NumDict {
add = addInt :: Int -> Int -> Int,
mul = mulInt :: Int -> Int -> Int,
neg = negInt :: Int -> Int
}
numDFloat :: NumD Float
numDFloat = NumDict {
add = addFloat :: Float -> Float -> Float,
mul = mulFloat :: Float -> Float -> Float,
neg = negFloat :: Float -> Float
}
square' :: NumD a -> a -> a
square' numDa x = mul numDa x x
square’ numDInt 3
square’ numDFloat 3.14
変換時に引数の
型を見て自動的的に挿入
Scalaの型クラス
trait Num[A] {
def add: A => A => A
def mul: A => A => A
def neg: A => A
}
implicit val numInt: Num[Int] = new Num[Int] {
def add: Int => Int => Int = addInt
def mul: Int => Int => Int = mulInt
def neg: Int => Int = negInt
}
implicit val numFloat: Num[Float] = new Num[Float] {
def add: Float => Float => Float = addFloat
def mul: Float => Float => Float = mulFloat
def neg: Float => Float = negFloat
}
def square[A](a: A)(implicit A: Num[A]): A = {
A.mul(a)(a)
}
square(3)(numInt)
square(3.14f)(numFloat)
implicit parameterの機能により
コンパイル時に引数の型を見て
自動的的に挿入
Dottyの型クラス
trait Num[A] {
def add: A => A => A
def mul: A => A => A
def neg: A => A
}
given Num[Int] {
def add = addInt
def mul = mulInt
def neg = negInt
}
given Num[Float] {
def add = addFloat
def mul = mulFloat
def neg = negFloat
}
def square[A: Num](a: A): A = {
summon[Num[A]].mul(a)(a)
}
square(3)
square(3.14f)
まとめ
● 型を見て呼ばれる関数(メソッド)を選んでいるという観点ではHaskellもScalaも同じ
ことをしている
● 表現が違うだけ
○ haskellは型クラス用のsyntax(class, instance, type constraint(=>))を導入している
参考
● https://people.csail.mit.edu/dnj/teaching/6898/papers/wadler88.pdf
● https://qiita.com/Biacco/items/083f05d5d1d87730f7db
● https://dotty.epfl.ch/docs/reference/contextual/typeclasses.html
Haskellの型クラス(変換後)(レコード不使用版)
data NumD a = NumDict (a -> a -> a) (a -> a -> a) (a -> a)
add (NumDict a m n) = a
mul (NumDict a m n) = m
neg (NumDict a m n) = n
numDInt :: NumD Int
numDint = NumDict addInt mulInt negInt
numDFloat :: NumD Float
numDFloat = NumDict addFloat mulFloat negFloat
square' :: NumD a -> a -> a
square' numDa x = mul numDa x x
square’ numDInt 3
square’ numDFloat 3.14
変換時に引数の
型を見て自動的的に挿入

More Related Content

What's hot

関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門Hideyuki Tanaka
 
たのしい高階関数
たのしい高階関数たのしい高階関数
たのしい高階関数Shinichi Kozake
 
F#とC#で見る関数志向プログラミング
F#とC#で見る関数志向プログラミングF#とC#で見る関数志向プログラミング
F#とC#で見る関数志向プログラミングsatoshimurakumo
 
こわくない型クラス
こわくない型クラスこわくない型クラス
こわくない型クラスKota Mizushima
 
関数型プログラミング in javascript
関数型プログラミング in javascript関数型プログラミング in javascript
関数型プログラミング in javascriptRyuma Tsukano
 
Java初心者勉強会(2015/08/07)資料
Java初心者勉強会(2015/08/07)資料Java初心者勉強会(2015/08/07)資料
Java初心者勉強会(2015/08/07)資料Toshio Ehara
 
ラムダ計算入門
ラムダ計算入門ラムダ計算入門
ラムダ計算入門Eita Sugimoto
 
これから Haskell を書くにあたって
これから Haskell を書くにあたってこれから Haskell を書くにあたって
これから Haskell を書くにあたってTsuyoshi Matsudate
 
Java電卓勉強会資料
Java電卓勉強会資料Java電卓勉強会資料
Java電卓勉強会資料Toshio Ehara
 
Scalaによる型安全なエラーハンドリング
Scalaによる型安全なエラーハンドリングScalaによる型安全なエラーハンドリング
Scalaによる型安全なエラーハンドリングTanUkkii
 
何が選ばれたかという情報から評価関数推定2
何が選ばれたかという情報から評価関数推定2何が選ばれたかという情報から評価関数推定2
何が選ばれたかという情報から評価関数推定2Miyako Yuno
 
テンプレートメタプログラミング as 式
テンプレートメタプログラミング as 式テンプレートメタプログラミング as 式
テンプレートメタプログラミング as 式digitalghost
 
プログラミング言語のパラダイムシフトーScalaから見る関数型と並列性時代の幕開けー
プログラミング言語のパラダイムシフトーScalaから見る関数型と並列性時代の幕開けープログラミング言語のパラダイムシフトーScalaから見る関数型と並列性時代の幕開けー
プログラミング言語のパラダイムシフトーScalaから見る関数型と並列性時代の幕開けーTanUkkii
 
Implicit Explicit Scala
Implicit Explicit ScalaImplicit Explicit Scala
Implicit Explicit ScalaKota Mizushima
 
すごいHaskell 第7章 型や型クラスを自分で作ろう(後編)
すごいHaskell 第7章 型や型クラスを自分で作ろう(後編)すごいHaskell 第7章 型や型クラスを自分で作ろう(後編)
すごいHaskell 第7章 型や型クラスを自分で作ろう(後編)Nozomu Kaneko
 
Python勉強会4-制御構文とパッケージ
Python勉強会4-制御構文とパッケージPython勉強会4-制御構文とパッケージ
Python勉強会4-制御構文とパッケージ理 小林
 

What's hot (20)

関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
 
たのしい高階関数
たのしい高階関数たのしい高階関数
たのしい高階関数
 
F#とC#で見る関数志向プログラミング
F#とC#で見る関数志向プログラミングF#とC#で見る関数志向プログラミング
F#とC#で見る関数志向プログラミング
 
こわくない型クラス
こわくない型クラスこわくない型クラス
こわくない型クラス
 
Lisp講義1
Lisp講義1Lisp講義1
Lisp講義1
 
関数型プログラミング in javascript
関数型プログラミング in javascript関数型プログラミング in javascript
関数型プログラミング in javascript
 
Java初心者勉強会(2015/08/07)資料
Java初心者勉強会(2015/08/07)資料Java初心者勉強会(2015/08/07)資料
Java初心者勉強会(2015/08/07)資料
 
ラムダ計算入門
ラムダ計算入門ラムダ計算入門
ラムダ計算入門
 
これから Haskell を書くにあたって
これから Haskell を書くにあたってこれから Haskell を書くにあたって
これから Haskell を書くにあたって
 
Java電卓勉強会資料
Java電卓勉強会資料Java電卓勉強会資料
Java電卓勉強会資料
 
Scalaによる型安全なエラーハンドリング
Scalaによる型安全なエラーハンドリングScalaによる型安全なエラーハンドリング
Scalaによる型安全なエラーハンドリング
 
何が選ばれたかという情報から評価関数推定2
何が選ばれたかという情報から評価関数推定2何が選ばれたかという情報から評価関数推定2
何が選ばれたかという情報から評価関数推定2
 
テンプレートメタプログラミング as 式
テンプレートメタプログラミング as 式テンプレートメタプログラミング as 式
テンプレートメタプログラミング as 式
 
プログラミング言語のパラダイムシフトーScalaから見る関数型と並列性時代の幕開けー
プログラミング言語のパラダイムシフトーScalaから見る関数型と並列性時代の幕開けープログラミング言語のパラダイムシフトーScalaから見る関数型と並列性時代の幕開けー
プログラミング言語のパラダイムシフトーScalaから見る関数型と並列性時代の幕開けー
 
Implicit Explicit Scala
Implicit Explicit ScalaImplicit Explicit Scala
Implicit Explicit Scala
 
すごいHaskell 第7章 型や型クラスを自分で作ろう(後編)
すごいHaskell 第7章 型や型クラスを自分で作ろう(後編)すごいHaskell 第7章 型や型クラスを自分で作ろう(後編)
すごいHaskell 第7章 型や型クラスを自分で作ろう(後編)
 
Clean
Clean Clean
Clean
 
Python勉強会4-制御構文とパッケージ
Python勉強会4-制御構文とパッケージPython勉強会4-制御構文とパッケージ
Python勉強会4-制御構文とパッケージ
 
大人のお型付け
大人のお型付け大人のお型付け
大人のお型付け
 
ラプシアン作用素
ラプシアン作用素ラプシアン作用素
ラプシアン作用素
 

型クラス