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)