2017-09-21 45 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"))