O que é a sintaxe Scala para uma função de tomar qualquer subtipo de Ordenada [A]?

votos
14

Eu quero escrever uma função que funciona em qualquer tipo Scala com uma ordenação total (ou seja, eu posso usar '<' nele). O que é a sintaxe para isso? O melhor que eu vim acima com é

def lessThan[T <: Ordered[T]](x: T, Y: T) = x < y

Isso não funciona, no entanto, quando eu tento usá-lo a partir do 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))

Essencialmente, eu acredito que eu quero o equivalente a este código Haskell:

lessThan :: (Ord a) => a -> a -> Bool
lessThan x y = x < y

Estou usando Scala 2.7.3 em um sistema Debian.

O que estou ausente, e onde?

Publicado 27/03/2009 em 21:58
fonte usuário
Em outras línguas...                            


1 respostas

votos
24

O equivalente a classes tipo de Haskell em Scala é feito através implícitos. Há duas maneiras de fazer o que você quer

O primeiro é com vista limites

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

A segunda é com um parâmetro implícito

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

O primeiro é o açúcar sintaxe para a tarde. Quanto mais tarde permite mais flexibilidade.

Respondeu 27/03/2009 em 23:21
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more