Qual è la sintassi Scala di una funzione di prendere qualsiasi sottotipo di ordinato [A]?

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

  •  22-08-2019
  •  | 
  •  

Domanda

Voglio scrivere una funzione che funziona su qualsiasi tipo di Scala con un ordinamento totale (vale a dire che posso usare '<' su di esso). Qual è la sintassi per questo? Il migliore che è venuta in mente è

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.

Quello che mi manca, e dove?

È stato utile?

Soluzione

L'equivalente di classi tipo di Haskell a Scala è fatto tramite impliciti. Ci sono due modi per fare ciò che si desidera

Il primo è con vista limiti

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

Il secondo è con un parametro implicito

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

Il primo è lo zucchero sintassi per il seguito. Il secondo permette una maggiore flessibilità.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top