Was ist die Scala -Syntax für eine Funktion, die einen Subtyp von ordnungsgemäßem [A] nimmt?
Frage
Ich möchte eine Funktion schreiben, die auf jedem Scala -Typ mit einer Gesamtbestellung funktioniert (dh ich kann '<' darauf verwenden). Was ist die Syntax dafür? Das Beste, was ich mir ausgedacht habe, ist
def lessThan[T <: Ordered[T]](x: T, Y: T) = x < y
Das funktioniert jedoch nicht, wenn ich versuche, es aus der Wiederholung zu verwenden:
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))
Ich glaube, ich möchte das Äquivalent dieses Haskell -Codes:
lessThan :: (Ord a) => a -> a -> Bool
lessThan x y = x < y
Ich verwende Scala 2.7.3 für ein Debian -System.
Was fehlt mir und wo?
Lösung
Das Äquivalent von Haskells Typklassen in Scala erfolgt über impliziten. Es gibt zwei Möglichkeiten, das zu tun, was Sie wollen
Das erste ist mit Ansichtsgrenzen
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
Die zweite ist mit einem impliziten Parameter
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
Ersteres ist Syntaxzucker für den späteren. Die spätere Ermöglicht mehr Flexibilität.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow