首页 > 解决方案 > Scala:如何调用多态的泛型函数

问题描述

我有以下代码

def findFirst[A](as: Array[A], p: A => Boolean): Int = {
  def loop(n: Int): Int =
    if (n >= as.length) -1
    else if (p(as(n))) n
    else loop(n+1)
  loop(0)
}

def main(args: Array[String]): Unit = {
  val as = Array("foo", "bar", "zed")
}

我不明白如何在 main 方法中调用函数findFirst 。

提前致谢!

标签: scalafunctional-programmingpolymorphism

解决方案


该函数接受两个参数,一个数组和一个“谓词”(一个函数本身接受一个参数并返回一个布尔值)。

因此,findFirst它是一个高阶函数(它将其他函数作为参数或返回函数)。

例如,您可以这样称呼它

 def isPrime(n: Int): Boolean = ??? // implement some code to return true for prime numbers
 findFirst(Array(1,2,3,4,5), isPrime)

或(使用匿名的内联函数)

 findFirst(Array("x", "ab", "abc"), x => x.length > 1 )

正如您所指出的,findFirst是一个具有变量 type 的泛型函​​数A。通常(如上面的示例中,编译器可以A从函数参数中推断出您想要的类型)。

如果不能,您可以明确:

findFirst[Int](Array(), isPrime)

推荐阅读