scala传递类型参数函数作为另一个函数的参数

scala传递类型参数函数作为另一个函数的参数,scala,functional-programming,Scala,Functional Programming,假设我有一个函数,取两个值和一个函数作为参数 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

假设我有一个函数,取两个值和一个函数作为参数

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)
那么,有没有一种方法可以将类型参数函数作为另一个函数的参数传递?

首先,这是可行的:

myfunction[Int](1, 2, ls)
myfunction(1, 2, ls[Int])
据我所知,Scala编译器试图解析
myfunction
的类型
T

它找到第一个和第二个参数,并乐意将其指定给
Int
(或其超类型的任何内容)作为最佳匹配

但是第三个参数说它可以得到任何参数!然后Scala编译器必须遵守并决定
T
将是
Any
。这导致
S
属于
Any
类型,并且没有隐式视图
Any=>Ordered[Any]

您不能将
myfunction
看作是定义
ls
的类型,而是定义
ls
可以是什么类型

这就是为什么这会起作用,因为你已经知道你想要什么类型的
f

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