当前位置:  开发笔记 > 编程语言 > 正文

什么是采用Ordered [A]的任何子类型的函数的Scala语法?

如何解决《什么是采用Ordered[A]的任何子类型的函数的Scala语法?》经验,为你挑选了1个好方法。

我想编写一个适用于任何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.

我错过了什么,在哪里?



1> James Iry..:

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

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


首先,您不能将任何T转换为Ordered [T].例如,定义一个排序(Int => Int).其次,当转换成为可能时,运行时不知道如何转换.相反,编译器知道如何插入函数以在运行时进行转换.
推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有