14. F# の場合
こうすれば OK。
➢ let inline mul (x:'a) (y:'a) : 'a = x * y;;
val inline mul :
x: ^a -> y: ^a -> ^a when ^a : (static member ( * ) : ^a * ^a -> ^a)
> let muli:(int -> int -> int) = mul;;
val muli : (int -> int -> int)
> let mulf:(float -> float -> float) = mul;;
val mulf : (float -> float -> float)
> muli 3 5;;
val it : int = 15
> mulf 3. 5.;;
val it : float = 15.0
> mul 3 5;;
val it : int = 15
> mul 3. 5.;;
val it : float = 15.0
15. Haskell の場合
Prelude> :set +m
Prelude> data Point = P { x :: Float, y :: Float }
Prelude> let p1 = P { x = 3.0, y = 4.0 }
Prelude> let p2 = P { x = 5.0, y = 6.0 }
Prelude> p1 + p2
<interactive>:5:4:
No instance for (Num Point) arising from a use of `+'
Possible fix: add an instance declaration for (Num Point)
In the expression: p1 + p2
In an equation for `it': it = p1 + p2
Prelude> instance Num Point where (P x1 y1) + (P x2 y2) = (P (x1 + x2) (y1 + y2))
※ '*', 'abs', 'signum', 'fromInteger' が定義されていないという警告が出る。
Prelude> let p3 = p1 + p2
Prelude> x p3
8.0
Prelude> y p3
10.0