3 votes

J'ai du mal à comprendre pourquoi cette fonction est appelée MapReduce.

Dans mon Cours Scala un exemple a été donné. Il s'agissait de trouver une fonction plus généralisée, qui peut être utilisée pour définir une fonction de sommation arithmétique et une fonction de production arithmétique. Voici les fonctions qui doivent être généralisées.

def sum(f:Int=>Int)(a:Int,b:Int):Int ={
 if(a>b) 0
 else f(a) + sum(f)(a+1,b)
}

def product(f:Int=>Int)(a:Int,b:Int):Int={
 if(a>b)1
 else f(a)*product(f)(a+1,b)
}

Pour généraliser ces fonctions, le professeur a donné une telle fonction :

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

La fonction mapReduce peut donc être utilisée pour généraliser les fonctions somme et produit comme suit :

def sumGN(f:Int=>Int)(a:Int,b:Int) = mapReduce(f, (x,y)=>(x+y), 0)(a, b)
def productGN(f:Int=>Int)(a:Int,b:Int) = mapReduce(f, (x,y)=>(x*y), 1)(a, b)

J'ai jeté un coup d'œil à la définition de map reduce dans la programmation fonctionnelle mais j'ai du mal à comprendre pourquoi la fonction généralisée a été nommée map reduce ci-dessus. Je n'arrive pas à saisir la relation. Toute aide sera la bienvenue.

Salutations

5voto

Wug Points 7672

La programmation fonctionnelle comporte généralement trois opérateurs centraux : map , reduce (parfois appelé fold ), et filter .

  • Map prend une liste et une opération et produit une liste contenant l'opération appliquée à tout ce qui se trouve dans la première liste.
  • Filter prend une liste et un test et produit une autre liste contenant uniquement les éléments qui passent le test.
  • Reduce (ou fold) prend une liste, une opération et une valeur initiale et applique l'opération à la valeur initiale et aux éléments de la liste, en passant la sortie dans lui-même avec l'élément suivant de la liste, produisant la somme opérationnelle de la liste.

Si, par exemple, votre liste est [2,3,4,5,6,7], votre valeur initiale est 1, et votre opération est l'addition, la réduction se comportera de la manière suivante :

Reduce([2,3,4,5,6,7], +, 1) = ((((((initial + 2) + 3) + 4) + 5) + 6) + 7)

Votre instructeur peut l'appeler mapReduce parce que c'est le nom du paradigme, bien que simplement reduce serait également suffisant.

Si vous êtes curieux de connaître la signification de son nom, vous devriez lui demander. C'est ton instructeur et tout.

4voto

Debilski Points 28586

Il ne s'agit en aucun cas d'une explication exacte (les noms sont de toute façon flous) mais voici une définition alternative :

def mapReduce(f: Int => Int, combine: (Int, Int) => Int, zero: Int)(a: Int, b: Int): Int ={
  if (a > b) zero
  else (a to b).map(f).reduce(combine)
}

Vous voyez le lien ?

1voto

Ricky Clarkson Points 1724

La fonction de mappage de mapReduce est f dans la question, bien qu'il n'y ait jamais d'exemple de sa définition. Pour la somme et le produit, il s'agirait de la fonction d'identité, mais si vous additionnez les carrés, la fonction de correspondance serait la fonction carrée.

La fonction de réducteur de mapReduce est combine, dans laquelle nous réduisons un tuple d'accumulateur+valeur à un nouvel accumulateur pour la récursion suivante.

Je pense que le chaînon manquant, outre le fait que le code n'est pas très clair, est de traiter les nombres comme des collections (par exemple, 3 est une collection de trois 1). C'est assez inhabituel et je ne sais pas ce que cela vous apporte, mais il se pourrait que votre professeur utilise l'analogie entre les nombres et les collections pour quelque chose de plus profond plus tard.

Est-ce que ça vient du cours d'Odersky ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X