2017-09-21 3 views
0

J'ai cette fonction polymorphes:Passe Recherche terme et opérateur de Scala polymorphes Fonction

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) 
} 

De la programmation fonctionnelle à Scala et je veux passer l'opérateur < est-il égal à une valeur spécifique>. Comment ferais-je cela? J'ai actuellement ceci:

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

Ici, l'opérateur est < == "DEF">. Scala n'aime pas ça mais je n'arrive pas à trouver un moyen de transmettre cette valeur, une paire d'opérateurs. Quelque chose me dit que currying pourrait être utilisé ici?

Répondre

0

La syntaxe complète de spécifier cette fonction serait:

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

Alors, vous pouvez:

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

Cependant, si vous changez la définition findFirst en deux listes de paramètres distinctes:

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

Alors scala peut regarder le premier paramètre (le tableau), voir que A doit être String, et en déduire que le type du second paramètre doit être String => Boolean, de sorte que vous pouvez omettre l'annotation de type:

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

Ou mieux encore:

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

Vous avez juste besoin d'un trait de soulignement:

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