如何在scala中编写比较函数?

时间:2015-03-20 03:11:13

标签: scala functional-programming

例如,我想检查a是否大于b,这是我的代码

def gt(a:Any,b:Any):Boolean = a match{
  case a:Ordered[Any] => (a compareTo b ) > 0
  case _ => false
}

然而,有更准确的方法来实现这个?因为编译器会发出警告:

<console>:8: warning: non-variable type argument Any in type pattern Comparable[Any] is unchecked since it is eliminated by erasure
         case a:Comparable[Any] => (a compareTo b ) > 0

更新

隐式视图应该可以完成工作,但我想做的就是有一个功能 使用参数(a:Any,b:Any),而不是类型参数。在java中,代码可能是这样的,但我不知道如何用Scala方式实现它

public static boolean gt(Object a, Object b){
    if(a instanceof Comparable && b.getClass() == a.getClass() ){
        return ((Comparable) a).compareTo(b) > 0;
    }else {
        return false;
    }
}

再次更新,我已经提出了一个可行的解决方案,但我知道这不是最好的方法,我会打开这个问题

def ls(a: Any, b: Any): Boolean = {
  a match {
    case (a: Comparable[Any]) => (a compareTo b) < 0
    case _ => false
  }
}

1 个答案:

答案 0 :(得分:4)

对于某些非常基本的情况(例如gt(2,1)),您的方法将返回错误。你可能正在寻找:

def gt[T <% Ordered[T]](a:T, b:T) = a > b

在您的示例中,您避免指定通用参数(参数T)。这保证了函数的参数具有相同的类型,从而实现了某种类型的安全性。

您希望订购该类型参数。在Scala中实现它的方式是Ordered trait,它将self类型作为泛型参数。

语法<%表示需要从TOrdered[T]进行隐式转换(称为视图绑定类型参数)。对于Scala中的所有标准有序类型(例如IntChar等)都是如此。如果没有此视图绑定,编译器就无法知道泛型参数是否必需。

最后,Ordered上有>函数,因此您无需使用compareTo,因为它已经实现了。

您可以在文档here中详细了解隐式视图。 您可以在文档here中详细了解Ordered