我想编写一个适用于任何Scala类型的函数,具有总排序(即我可以使用'<').那是什么语法?我想出的最好的是
def lessThan[T <: Ordered[T]](x: T, Y: T) = x < y
但是,当我尝试从REPL使用它时,这不起作用:
scala> lessThan(1, 2):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)) :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.
我错过了什么,在哪里?
Scala中Haskell类型类的等价物是通过implicits完成的.有两种方法可以做你想要的
第一个是视图边界
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
前者是后者的语法糖.后者允许更大的灵活性.