Ich möchte eine Funktion schreiben, die auf jedem Scala-Typ mit einer Gesamtbestellung funktioniert (d. H. Ich kann '<' darauf verwenden). Wie lautet die Syntax dafür? Das Beste, was ich habe kommen mit istWie lautet die Scala-Syntax für eine Funktion, die einen Untertyp von Ordered [A] verwendet?
def lessThan[T <: Ordered[T]](x: T, Y: T) = x < y
Das ist nicht, obwohl nicht funktioniert, wenn ich es aus dem REPL Versuchen Sie es mit:
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))
Im Grunde glaube ich das Äquivalent von dieser wollen Haskell code:
lessThan :: (Ord a) => a -> a -> Bool
lessThan x y = x < y
Ich verwende scala 2.7.3 auf einem Debian-System.
Was vermisse ich und wo?
Warum müssen Sie das Implizit explizit als Parameter in die Methode einbringen? Wenn die scala-Laufzeitumgebung weiß, wie T implizit in Ordered [T] umgewandelt wird, warum muss ich einen impliziten Parameter auflisten? Vielen Dank! – shj
Erstens kann man nicht einfach irgendein T in ein Ordered [T] umwandeln. Definieren Sie zum Beispiel eine Reihenfolge über (Int => Int). Zweitens, wenn eine Konvertierung möglich ist, kann die Laufzeit nicht konvertieren. Stattdessen weiß der Compiler, wie eine Funktion eingefügt wird, um die Konvertierung zur Laufzeit auszuführen. –
sieht so aus, als ob die erste Methode veraltet ist [SI-7629] (https://issues.scala-lang.org/browse/SI-7629) –