Was ist die Scala -Syntax für eine Funktion, die einen Subtyp von ordnungsgemäßem [A] nimmt?

StackOverflow https://stackoverflow.com/questions/691422

  •  22-08-2019
  •  | 
  •  

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?

War es hilfreich?

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
scroll top