ジェネリックなmax

なんか難しい。

scala> def max[T](a: T, b: T)(implicit orderer: T => Ordered[T]) = if (a > b) a else b
max: [T](T,T)(implicit (T) => Ordered[T])T

scala> max(1, 3)
res6: Int = 3

scala> max(10, 3)
res7: Int = 10

scala> max(10., 3.)
res8: Double = 10.0

scala> max(10., 3)
<console>:6: error: no implicit argument matching parameter type (AnyVal) => Ordered[AnyVal] was found.
       max(10., 3)
       ^

ふむふむ。

scala> def max[T <% Ordered[T]](a: T, b: T) = if (a > b) a else b
max: [T](T,T)(implicit (T) => Ordered[T])T

scala> max(2, 6)
res0: Int = 6

scala> max(9, 6)
res1: Int = 9

scala> max(9., 6.)
res2: Double = 9.0

scala> max(9., 6)
<console>:6: error: no implicit argument matching parameter type (AnyVal) => Ordered[AnyVal] was found.
       max(9., 6)
       ^

ほほーう。