加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 09:20:45 所属栏目:安全 来源:网络整理
导读:我想编写一个适用于任何Scala类型的功能,具有总排序(即可以使用’').那是什么语法?我想出的最好的是 def lessThan[T : Ordered[T]](x: T,Y: T) = x y 不过,当我尝试从REPL使用它时,这不行: scala lessThan(1,2)console:8: error: inferred type arguments
我想编写一个适用于任何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.

我失踪了,在哪里?

解决方法

相当于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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读