generated at
Ad Hoc多相
Ad hoc polymorphism
最も一般的な例がoverload
「複数の異なる(型の)関数」を「同一の名前」で呼んでいる
実体は複数あるが記号が同じ
ライブラリが提供している型や型クラスに対して、その実装を直接触らなくてもoverloadすることが可能
静的なpolymorphism
アドホック多相をより強力にしたもの

overloadがイメージしやすい
以下のような型をとるようなとある関数 sum があったとして、
型ごとに実装を変えられる
この「型ごと」の型同士には互いに関係はない
hs
sum :: a -> a -> a


Ad Hoc多相は関数の名前が同じなだけであって、実装は全く異なる
実装というか意味?が異なる
例えば + 演算子
(+) :: Int -> Int -> Int の場合は、「加法」を意味する
(+) :: String -> String -> String の場合は、文字列の連結を意味する
適当にそれっぽく人間が定義を与えただけ
show型クラスに、特定の型をインスタンスにする例がわかりやすいかもしれない
data Human = Human Name Age という自作の型をどうshowするかが決められていない
例えば以下の様なコードを実行したときに、どう出力されるかは定義されていない
hs
data Human = Human Name Age let h = Human "tanaka" 42 show h -- > ???
Human "tanaka" 42 かもしれないし、 {Human: {name: "tanaka", age: 42}} かもしれない
この定義を型クラスを用いて行うことで自分で定義できる
hs
instance Show Human where show (Human name age) = name ++ " is " ++ show age ++ " years old" let h = Human "tanaka" 42 show h -- > "tanaka is 42 years old"
Intに対して show 2 とするのと同じように、自作型Humanに対して show を実行しているだけだが、どのように定義されているかは型ごとに異なっている
異なる型に対して同じ名前の関数を利用できるが、中身は異なる



ex.
+ に対して、数値同士の計算、文字列同士の連結の意味をもたせる
数値といってもintやfloatなどがあるがそれらに対しても気にせずに同じ関数 (+) を使えている
OCamlはアドホック多相を実現する機構がなく、型によって演算子を変える必要がある
+ +. とか


参考