将搜索词和运算符传递给 Scala 多态函数
Pass Search term and Operator to Scala Polymorphic Function
我有这个多态函数:
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 不喜欢那样,但我似乎无法想出一种方法来传递该值,运算符对。有人告诉我这里可以使用柯里化?
你只需要一个下划线:
println(findFirst(Array("abc", "def", "ghi"), _== "def"))
指定此函数的完整语法为:
(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"))
我有这个多态函数:
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 不喜欢那样,但我似乎无法想出一种方法来传递该值,运算符对。有人告诉我这里可以使用柯里化?
你只需要一个下划线:
println(findFirst(Array("abc", "def", "ghi"), _== "def"))
指定此函数的完整语法为:
(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"))