阶传递类型参数函数作为另一个函数的参数(scala pass type parameter func

2019-10-22 07:38发布

假设,我有一个函数,取两个值和参数的函数。

def ls[S](a: S, b: S)(implicit evl: S => Ordered[S]): Boolean = a < b
def myfunction[T](a: T, b: T, f:(T,T)=>Boolean) = {

  if (f(a, b)) {
    println("is ok")
  }
  else {
    println("not ok")
  }
}

myfunction(1, 2, ls)

在IDE不给任何错误信息,但是当我尝试编译和运行时,compliter给出这样的信息:

    Error:(14, 19) No implicit view available from S => Ordered[S].
myfunction(1, 2, ls);}
                 ^

那么,有没有一种方法来通过类型参数函数作为另一个函数的参数?

Answer 1:

首先,这样的工作:

myfunction[Int](1, 2, ls)
myfunction(1, 2, ls[Int])

从我的理解Scala编译器尝试解析型Tmyfunction

它发现第一和第二个参数,并很高兴把它分配给Int (或任何这是它的超)为最佳匹配。

但第三个参数说,它可以得到任何东西作为参数! 然后,Scala编译器必须遵守并决定TAny 。 这使得S是类型的Any ,并且没有隐式的视图Any => Ordered[Any]

你一定想不到myfunction是定义为一个类型ls而是ls定义什么类型T即可。

这就是为什么这将工作,你就已经知道什么类型的f希望你:

def myfunction[T](a: T, b: T)(f:(T,T)=>Boolean) = {
...
}
myfunction(1, 2)(ls)


文章来源: scala pass type parameter function as a parameter of another function