2009-03-27 3 views
14

すべてのScala型で動作する関数を作成したいと考えています(つまり、 '<'を使用できます)。その構文は何ですか?私が思い付くした最高のは、私はREPLからそれを使用しようとすると、しかし、動作しませんOrdered [A]のサブタイプを取る関数のScala構文は何ですか?

def lessThan[T <: Ordered[T]](x: T, Y: T) = x < y 

です:

基本的に
scala> lessThan(1, 2) 
<console>:8: error: inferred type arguments [Int] do not conform to method lessThan's type parameter bounds [T <: Ordered[T]] 
     lessThan(1, 2) 
    ^

scala> import runtime._ 
import runtime._ 

scala> lessThan(new RichInt(1), new RichInt(2)) 
<console>:8: error: inferred type arguments [scala.runtime.RichInt] do not conform to method lessThan's type parameter bounds [T <: Ordered[T]] 
     lessThan(new RichInt(1), new RichInt(2)) 

、私はこれと同等のものをしたいと考えていますハスケルコード:

lessThan :: (Ord a) => a -> a -> Bool 
lessThan x y = x < y 

私はDebianシステムでscala 2.7.3を使用しています。

私は何が欠けていますか?

答えて

24

ScalaのHaskellの型クラスに相当するのは、暗黙的に行われます。あなたは

が最初の第二は、前者は、後の構文糖である暗黙のパラメータで

scala> def lessThan[T](x : T, y : T)(implicit f : T => Ordered[T]) = x < y  
lessThan: [T](T,T)(implicit (T) => Ordered[T])Boolean 

scala> lessThan(4,3) 
res1: Boolean = false 

あるビューの境界で

scala> def lessThan[T <% Ordered[T]](x : T, y : T) = x < y 
lessThan: [T](T,T)(implicit (T) => Ordered[T])Boolean 

scala> lessThan(1,2) 
res0: Boolean = true 

でやりたいことには二つの方法があります。後者は、より柔軟性を可能にします。

+0

暗黙的に暗黙的に明示的にパラメータにする必要がありますか? scala-runtimeが暗黙的にTをOrdered [T]に変換する方法を知っている場合、なぜ暗黙のパラメータをリストする必要がありますか?ありがとう! – shj

+2

まず、TをOrdered [T]に変換することはできません。たとえば、順序を定義する(Int => Int)。第2に、変換が可能な場合、ランタイムは変換方法を知らない。代わりに、コンパイラは実行時に変換を行う関数を挿入する方法を知っています。 –

+0

は最初のメソッドが廃止されたように見えます[SI-7629](https://issues.scala-lang.org/browse/SI-7629) –

関連する問題