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

时间:2015-03-21 07:14:02

标签: 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, ls)

IDE不会给出任何错误消息,但是当我尝试编译并运行时,compliter会给出以下消息:

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

那么,有没有办法将类型参数函数作为另一个函数的参数传递?

1 个答案:

答案 0 :(得分:2)

首先这是有效的:

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

根据我的理解,Scala编译器尝试解析T的{​​{1}}类型。

它找到第一个和第二个参数,并乐于将其分配给myfunction(或其超类型的任何东西)作为最佳匹配。

但是第三个论点说它可以作为参数得到任何东西!然后,Scala编译器必须遵守并确定Int将为T。这导致Any属于S类型且没有隐式视图Any

您不能将Any => Ordered[Any]视为定义myfunction的类型,而是ls定义ls的类型。

这就是为什么这会有效,因为您已经知道您想要的T类型:

f