14

我想编写一个适用于任何具有总排序的Scala 类型的函数(即我可以在其上使用'<')。那是什么语法?我想出的最好的是

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

但是,当我尝试从 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))

本质上,我相信我想要这个 Haskell 代码的等价物:

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

我在 Debian 系统上使用 scala 2.7.3。

我错过了什么,在哪里?

4

1 回答 1

25

Scala 中的 Haskell 类型类的等价物是通过隐式完成的。有两种方法可以做你想做的事

第一个是视图边界

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

第二种是带隐式参数

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

前者是后者的语法糖。后者允许更大的灵活性。

于 2009-03-27T22:21:27.187 回答