0

我有这个多态函数:

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 不喜欢这样,但我似乎无法找到一种方法来传递该值,运算符对。有什么东西告诉我可以在这里使用柯里化吗?

4

2 回答 2

0

你只需要一个下划线:

println(findFirst(Array("abc", "def", "ghi"), _== "def"))
于 2017-09-21T21:01:55.830 回答
0

指定此函数的完整语法为:

(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可以看第一个参数(数组),看到Amust be String,推断第二个参数的类型must be String => Boolean,所以可以省略类型注解:

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

或者更好:

println(findFirst(Array("abc", "def", "ghi"))(_ == "def"))
于 2017-09-21T21:02:59.123 回答