2017-09-21 61 views
0

我有这样的多态函数:通行证搜索字词和操作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”>。斯卡拉不喜欢这一点,但我似乎无法找到一种方法来通过这个值,运算符对。有东西告诉我柯里可以用在这里?

回答

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 = { 
    ... 
} 

然后阶可以看一下对第一参数(阵列),请参阅A必须String,并推断出第二参数的类型必须是String => Boolean,所以可以省略类型注释:

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

或者更好的是:

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

你只需要一个下划线:

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