2009-03-27 15 views
14

Herhangi bir Scala türü üzerinde çalışan bir fonksiyon yazmak istiyorum. (Yani '<' seçeneğini kullanarak). Bunun için sözdizimi nedir? EsasenSipariş verilen [A] türünü kullanan bir işlev için Scala sözdizimi nedir?

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)) 

, bunu eşdeğer istiyorum inanıyoruz: Ben ile gelip en iyi ben repl onu kullanmayı deneyin ne zaman olsa da, çalışmaz

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

olduğunu Haskell kodu:

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

Bir Debian sisteminde scala 2.7.3 kullanıyorum.

Neyi eksik ve nerede?

cevap

24

Hascala'nın Scala'daki tür sınıflarının karşılığı, dolaylı olarak yapılır.

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 

ikinci örtülü bir parametresi

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 

eski ile size

öncelikle ne istediğini yapmak için iki yol vardır görünüm sınırları ile olan sonrası için sözdizimi şekerdir. Daha sonra daha fazla esneklik sağlar.

+0

Neden dolaylı olarak yönteme bir parametre olarak getirmek zorundasınız? Scala çalışma zamanı, örtülü olarak T'yi Siparişe [T] dönüştürmeyi bilirse neden örtülü bir parametre listelemem gerekir? Teşekkürler! – shj

+2

İlk önce, herhangi bir T'yi bir Siparişe [T] dönüştürebilirsiniz. Örneğin, bir sipariş tanımlayın (Int => Int). İkincisi, dönüştürme mümkün olduğunda, çalışma zamanı nasıl dönüştürüleceğini bilmez. Bunun yerine, derleyici, çalışma zamanında dönüştürmeyi yapmak için bir işlev eklemeyi bilir. –

+0

, ilk yöntemin kullanımdan kaldırıldığına benziyor [SI-7629] (https://issues.scala-lang.org/browse/SI-7629) –

İlgili konular