Scalaには、タイプクラスとして使用できる多くの特性があります。には、Ordered
とNumeric
などのタイプクラスがあります。NumericがOrderと異なる動作をするのはなぜですか?
Ordered
を使用してジェネリックメソッドを書くことができます
:
def f[T <% Ordered[T]](a: T, b: T) = if (a < b) a else b
私はNumeric
と同じようなことをやってみたかったが、これは動作しません:
def g[T <% Numeric[T]](a: T, b: T) = a * b
Ordered
とNumeric
の間に明らかな相違があるのはなぜですか?
私はこれを行うには、他の方法がある知っている、次のように動作します(バインドされたコンテキストを使用しています):
def g[T : Numeric](a: T, b: T) = implicitly[Numeric[T]].times(a, b)
しかし、それはちょうど2つの数値を乗算する*
を使用することができることよりも複雑に見えます。なぜNumeric
の形質に*
のようなメソッドが含まれないのに対して、Ordered
には<
のようなメソッドが含まれていますか?私が知っている
は、またthis answerも参照あなたがNumeric
と同じように使用することができますOrdering
があります:
def f[A : Ordering](a: A, b: A) = implicitly[Ordering[A]].compare(a, b)
素敵...とてもエレガント! –