2017-08-16 3 views
0

Je suivais un cours de Coursera où cet exemple apparaît dans la conférence, mais quand je tente de l'exécuter, il renvoie une erreur comme suit:Comprendre Scala corroyage

manquant liste d'arguments pour la méthode MapReduce dans l'objet HelloWorld

Les méthodes non appliquées sont uniquement converties en fonctions lorsqu'un type de fonction est attendu. Vous pouvez rendre cette conversion explicite en écrivant mapReduce _ ou mapReduce(_,_,_)(_,_) au lieu de mapReduce.

var doo = MapReduce (x => x, (x, y) => x * y, 0)

Voici le code que je veux exécuter.

def mapReduce(map: Int => Int, combine: (Int,Int)=>Int, 
       zero: Int)(a: Int,b: Int): Int = { 
    if (a>b) zero 
    else combine(map(a), mapReduce(map,combine,zero)(a+1,b)) 
} 

var doo = mapReduce(x => x, (x,y)=>x*y, 0) 
println(doo(1,4)) 

Répondre

1

Vous devez définir un paramètre undescore afin de créer une fonction au curry. Comme ceci:

scala> var doo = mapReduce(x => x, (x,y)=>x*y, 0) _ 
doo: (Int, Int) => Int = <function2> 

scala> println(doo(1,4)) 
0 
3

mapReduce veut deux listes d'arguments, mais vous êtes en lui donnant un. Essayez ceci:

val doo = mapReduce(x => x, (x,y) => x*y, 0) _ 

ou de manière équivalente,

val doo = mapReduce(identity, _*_, 0) _ 

Le _ à la fin représente la deuxième liste d'arguments. Il indique au compilateur que vous voulez que la valeur suffixée soit considérée comme une valeur fonctionnelle plutôt qu'une expression à évaluer.

Vous pouvez également donner une indication compilateur pour effectuer la conversion se fasse automatiquement en déclarant explicitement le type attendu de la expession:

val doo: (Int, Int) => Int = mapReduce(identity, _*_, 0) 

Et ne pas utiliser vars. Ils sont mauvais. Il suffit de faire semblant, il n'y a pas un tel mot-clé dans Scala, jusqu'à ce que vous en apprendre assez sur le langage pour être en mesure de reconnaître les cas extrêmement rares quand il est réellement nécessaire.

+0

Merci d'ajouter un soulignement fonctionne: D Magiquement – pannu