2. 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
4. 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
変換時に引数の
型を見て自動的的に挿入
5. 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の機能により
コンパイル時に引数の型を見て
自動的的に挿入
6. 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)
9. 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
変換時に引数の
型を見て自動的的に挿入