Voglio scrivere una funzione che funziona su qualsiasi tipo di Scala con un ordinamento totale (ad esempio, posso usare '<' su di esso). Qual è la sintassi per questo? Il migliore che è venuta in mente èQual è la sintassi di Scala per una funzione che accetta qualsiasi sottotipo di Ordinato [A]?
def lessThan[T <: Ordered[T]](x: T, Y: T) = x < y
che non funziona, però, quando provo ad usarlo dal REPL:
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))
In sostanza, credo che voglio l'equivalente di questo Codice Haskell:
lessThan :: (Ord a) => a -> a -> Bool
lessThan x y = x < y
Sto usando scala 2.7.3 su un sistema Debian.
Cosa mi manca e dove?
Perché devi implicare esplicitamente il parametro implicito nel metodo? Se scala-runtime sa come convertire implicitamente T in Ordered [T] perché devo elencare un parametro implicito? Grazie! – shj
Innanzitutto, non è possibile convertire qualsiasi T in Ordinato [T]. Ad esempio, definire un ordinamento su (Int => Int). In secondo luogo, quando la conversione è possibile, il runtime non sa come convertire. Invece, il compilatore sa come inserire una funzione per eseguire la conversione in fase di esecuzione. –
sembra che il primo metodo sia deprecato [SI-7629] (https://issues.scala-lang.org/browse/SI-7629) –