将搜索术语和操作员传递到Scala多态性功能



我具有此多态函数:

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

来自Scala中的功能编程,我想通过操作员<它等于特定值>。我该怎么做?我目前有:

println(findFirst(Array("abc", "def", "ghi"), == "def"))

在这里,操作员是<==" def">。Scala不喜欢那样,但是我似乎无法找到一种通过该值,操作员对的方法。有些东西告诉我可以在这里使用咖喱?

指定此功能的完整语法将是:

(x: String) => x == "def"

因此您可以做:

println(findFirst(Array("abc", "def", "ghi"), (x: String) => x == "def"))

但是,如果将findFirst定义更改为两个单独的参数列表:

def findFirst[A](as: Array[A])(p: A => Boolean): Int = {
  ...
}

然后,Scala可以查看第一个参数(数组),请参见A必须是String,并推断第二个参数的类型必须为String => Boolean,因此您可以省略类型注释:

println(findFirst(Array("abc", "def", "ghi"))(x => x == "def"))

或更高:

println(findFirst(Array("abc", "def", "ghi"))(_ == "def"))

您只需要一个下划线:

println(findFirst(Array("abc", "def", "ghi"), _== "def"))

最新更新