Quelle est la différence entre le nourrissage et l'application partielle?
J'ai assez souvent voir sur Internet les différentes plaintes que les autres peuples des exemples de nourrissage sont pas nourrissage, mais sont en fait juste une application partielle.
Je n'ai pas trouvé une bonne explication de ce que l'application partielle, ou en quoi elle diffère de nourrissage. Il semble y avoir une confusion générale, avec l'équivalent des exemples sont décrits comme étant nourrissage dans certains endroits, et l'application partielle dans d'autres.
Quelqu'un pourrait-il me donner une définition de ces deux termes, et les détails de la façon dont ils diffèrent?
OriginalL'auteur SpoonMeiser | 2008-10-20
Vous devez vous connecter pour publier un commentaire.
Nourrissage est la conversion d'une seule fonction de n arguments en n fonctions à un seul argument de chacun. Compte tenu de la fonction suivante:
Quand au curry, devient:
Afin d'obtenir l'application intégrale de f(x,y,z), vous devez faire ceci:
De nombreux langages fonctionnels vous permettent d'écrire des
f x y z
. Si vous n'appelezf x y
ou f(x)(y) ensuite, vous obtenez un partiellement appliqué en fonction de la valeur de retour est une fermeture delambda(z){z(x(y))}
avec le passé-dans les valeurs de x et de y pourf(x,y)
.Un moyen d'utiliser l'application partielle est de définir des fonctions que les applications partielles de des fonctions généralisées, comme fois:
plus ou moins, oui. Si vous ne fournir qu'un sous-ensemble des arguments, vous allez obtenir une fonction qui accepte le reste des arguments
Le fait de modifier une fonction f(a, b, c, d) à g(a, b) le comte comme une application partielle? Ou est-ce seulement lorsqu'il est appliqué à des fonctions curryfiées? Désolé d'être une douleur, mais je suis la pêche à la ligne pour une réponse explicite ici.
Je suppose que c'est juste un de ces concepts qui apporte le pédant en moi - mais un appel à des sources faisant autorité, peu à même de satisfaire, car ils semblent tous pointer vers l'un de l'autre. Wikipédia est à peine ce que je considère comme une source faisant autorité, mais je comprends que c'est dur de trouver autre chose. Il suffit de dire que je pense que nous savons tous les deux que dont nous parlons, et le pouvoir de celle-ci, indépendamment de si oui ou non nous pouvons être d'accord (ou désaccord) sur les particularités de la langue vernaculaire! 🙂 Merci Marc!
Concernant votre premier commentaire, ce que vous étiez en train de parler d' decurrying. Nourrissage est de prendre une multi-fonction arg en entrée et en retournant une chaîne de 1-arg fonctions de sortie. De nourrissage est de prendre une chaîne de 1-arg fonctions d'entrée et de retour d'un multi-fonction arg en sortie. Comme il est expliqué stackoverflow.com/a/23438430/632951
OriginalL'auteur Mark Cidade
La façon la plus simple pour voir comment ils diffèrent, c'est d'envisager une exemple réel. Supposons que nous avons une fonction
Add
qui prend 2 nombres en entrée et renvoie un nombre en sortie, par exemple,Add(7, 5)
retourne12
. Dans ce cas:Partielle de l'application de la fonction
Add
avec une valeur7
va nous donner une nouvelle fonction de sortie. Cette fonction prend 1 nombre en entrée et retourne un nombre. En tant que tel:Donc, nous pouvons faire ceci:
Nourrissage la fonction
Add
va nous donner une nouvelle fonction de sortie. La fonction en elle-même dure 1 nombre en entrée et sorties encore une autre nouvelle fonction. Cette troisième fonction prend alors 1 nombre en entrée et renvoie un nombre en sortie. En tant que tel:Donc, nous pouvons faire ceci:
En d'autres termes, "nourrissage" et "application partielle" sont deux totalement différentes fonctions. Nourrissage prend exactement 1 entrée, alors que l'application partielle prend 2 (ou plus) des entrées.
Même s'ils sont tous deux de retour d'une fonction, comme la production, les fonctions sont totalement différentes formes comme démontré ci-dessus.
n-ary
à(x - n)-ary
, nourrissage den-ary
àn * 1-ary
. Une application partielle de la fonction de portée réduite (de la demande), qui est,Add7
est moins expressif queAdd
. Un curry de fonction sur l'autre main est aussi expressif que la fonction originale.Je crois que le plus caractéristique, c'est quand nous curry f(x,y,z)=>R, on obtient f(x) qui retourne g(y)=>h(z)=>R, chacune la consommation d'un seul argument; mais quand nous avons partiellement application de f(x,y,z) f(x) nous obtenons g(y,z)=>R, qui est, avec deux arguments. Si ce n'est pour que le trait, on pourrait dire que le nourrissage est comme l'application partielle de 0 arguments, laissant ainsi tous les arguments indépendant; cependant, en réalité, f() partiellement appliquées à 0 arguments est une fonction de consommer 3 args à la fois, contrairement au curry f().
Une fois de plus la réponse correcte n'est pas le premier ou le plus voté: L'explication simple de la signature de curry vs partielle à la fin de cette réponse, c'est vraiment la façon la plus simple de résoudre la question.
Quel est le commentaire
f2(7)(5) is just a syntactic shortcut
veux dire? (J'en connais très peu.) Ne pasf2
déjà contenir/"savoir" 7?est-il un
curry
mise en œuvre quelque part (ne pense pas que c'est dansfunctools
)OriginalL'auteur Pacerier
Note: ceci a été pris de F# Bases un excellent article d'introduction .NET développeurs d'entrer dans la programmation fonctionnelle.
OriginalL'auteur dodgy_coder
Question intéressante. Après un peu de recherche, "Partielle de la Fonction de Demande n'est pas nourrissage" a donné la meilleure explication que j'ai trouvé. Je ne peux pas dire que le pratique différence est particulièrement évident pour moi, mais je ne suis pas un FP expert...
Un autre utile-à la recherche de la page (qui je l'avoue je n'ai pas lu encore) est "Nourrissage et l'Application Partielle avec Java Fermetures".
Il ne ressemble à ce qui est largement confondu paire de termes, vous l'esprit.
Nourrissage est de le faire avec des n-uplets (l'activation d'une fonction qui prend un n-uplet d'argument dans un qui prend n séparer les arguments, et vice-versa). L'application partielle est la capacité à appliquer une fonction à certains arguments, ce qui donne une nouvelle fonction pour le reste des arguments. Il est facile à retenir si vous pensez juste nourrissage == à faire avec des n-uplets.
les liens que vous avez posté sont instructifs, mais ce sera mieux pour étendre votre réponse et ajoutez un peu plus d'info ici.
voir meta.stackoverflow.com/questions/275464/...
Ne peux pas croire que vous avez obtenu 20 upvotes pour un couple de liens et d'une admission, vous ne savez pas vraiment la différence entre le curry et l'application partielle. Bien joué, monsieur.
OriginalL'auteur Jon Skeet
J'ai répondu à cette question dans un autre thread https://stackoverflow.com/a/12846865/1685865 . En bref, partielles de la fonction de demande est à propos de la fixation des arguments d'une fonction multivariable à céder d'une autre fonction avec moins d'arguments, tandis que le Nourrissage est sur la façon de transformer une fonction de N arguments dans une fonction unaire qui retourne une fonction unaire...[Un exemple de Nourrissage est indiqué à la fin de ce post.]
Nourrissage est surtout un intérêt théorique: on peut exprimer les calculs en utilisant uniquement des fonctions unaires (c'est à dire chaque fonction unaire). Dans la pratique, et comme sous-produit, c'est une technique qui peut faire beaucoup de pratique (mais pas tous) les applications fonctionnelles trivial, si la langue a des fonctions curryfiées. Encore une fois, il n'est pas le seul moyen de mettre en œuvre les applications partielles. Donc, vous pourriez rencontrer des scénarios où l'application partielle est fait d'une autre manière, mais les gens sont croyant que c'est comme Lancer.
(Exemple de Nourrissage)
Dans la pratique, on ne serait pas juste écrire
ou l'équivalent javascript
au lieu de
pour l'amour de Nourrissage.
Non, nourrissage n'est pas un cas particulier de l'application partielle: application partielle d'une 2-la fonction d'entrée n'est pas la même chose que lancer la fonction. Voir stackoverflow.com/a/23438430/632951 .
OriginalL'auteur Ji Han
Nourrissage est une fonction de un argument qui prend une fonction
f
et retourne une nouvelle fonctionh
. Notez queh
prend un argument deX
et renvoie un fonction que les cartes deY
àZ
:Application partielle est une fonction de deux(ou plus) arguments qui prend une fonction
f
et un ou plusieurs des arguments supplémentaires àf
et retourne une nouvelle fonctiong
:La confusion naît du fait que un à deux arguments de la fonction de l'égalité suivante:
Deux côtés donnera le même argument une fonction.
L'égalité n'est pas vraie pour plus arité de fonctions, car dans ce cas nourrissage sera de retour un argument de la fonction, tandis que l'application partielle sera de retour un multiple de l'argument de la fonction.
La différence est aussi dans le comportement, tandis que la nourrissage transforme l'ensemble de la fonction d'origine de manière récursive(une fois pour chaque argument), l'application partielle est juste une étape de remplacement.
Source: Wikipédia Nourrissage.
OriginalL'auteur Roland
La différence entre le curry et l'application partielle peut être mieux illustré par le biais de ce code JavaScript suivant exemple:
Application partielle des résultats en fonction de la plus petite arité; dans l'exemple ci-dessus,
f
a une arité de 3 alors quepartial
seulement a une arité de 2. Plus important encore, une application partielle de la fonction retourner le résultat tout de suite après invoquer, pas une autre fonction en bas de la nourrissage de la chaîne. Donc, si vous voyez quelque chose commepartial(2)(3)
, ce n'est pas une application partielle dans la réalité.Pour en savoir plus:
OriginalL'auteur gsklee
Pour moi, l'application partielle doit créer une nouvelle fonction, où les arguments utilisés sont complètement intégrés dans la fonction obtenue.
La plupart des langages fonctionnels mettre en œuvre nourrissage par un retour fermeture: ne pas évaluer sous lambda quand partiellement appliquée. Ainsi, pour l'application partielle d'être intéressant, nous devons faire une différence entre le nourrissage et l'application partielle et d'envisager l'application partielle comme nourrissage en plus de l'évaluation en vertu de la lambda.
OriginalL'auteur Taoufik Dachraoui
Je pourrais être très mal ici, car je n'ai pas une formation solide en mathématiques théoriques ou de la programmation fonctionnelle, mais à partir de ma brève incursion dans la FP, il semble que nourrissage tend à son tour une fonction à N arguments en N de fonctions à un argument, alors que l'application partielle [en pratique] fonctionne mieux avec les variadic fonctions avec un nombre indéterminé d'arguments. Je sais que certains des exemples donnés dans les réponses précédentes défier cette explication, mais il m'a aidé le plus à séparer les concepts. Considérons l'exemple suivant (écrit en CoffeeScript pour la concision, toutes mes excuses si il confond de plus, mais s'il vous plaît demander pour plus de précisions, si nécessaire):
C'est évidemment un exemple artificiel, mais remarquez que partiellement l'application d'une fonction qui accepte un nombre quelconque d'arguments nous permet d'exécuter une fonction, mais avec certaines données préliminaires. Lancer une fonction est similaire, mais nous permet d'exécuter un N-paramètre de la fonction en morceaux jusqu'à ce que, mais seulement jusqu'à ce que, tous les N paramètres sont pris en compte.
Encore une fois, c'est ma façon de voir les choses que j'ai lu. Si quelqu'un n'est pas d'accord, j'apprécierais un commentaire pour expliquer pourquoi, plutôt que d'un immédiat downvote. Aussi, si la CoffeeScript est difficile à lire, veuillez visiter coffeescript.org, cliquez sur "essayez coffeescript" coller " dans mon code pour voir la version compilée, qui peut (heureusement) faire plus de sens. Merci!
OriginalL'auteur sunny-mittal
J'ai eu cette question beaucoup de choses tout en apprenant et en ont depuis été demandé à de nombreuses reprises. La façon la plus simple de décrire la différence est que les deux sont les mêmes 🙂 Laissez-moi vous expliquer...il y a évidemment des différences.
Partielle de l'application et de lancer impliquent fournissant des arguments à une fonction, peut-être pas tous à la fois. Un assez exemple canonique est l'ajout de deux nombres. En pseudo-code (en fait, JS, sans mots-clés), la fonction de base peuvent être les suivantes:
Si je voulais un "addOne" de la fonction, j'ai pu appliquer partiellement ou curry:
Maintenant de les utiliser est clair:
Alors, quelle est la différence? Eh bien, c'est subtil, mais l'application partielle consiste à fournir des arguments et le renvoi de la fonction sera alors exécuter la fonction principale lors de la prochaine invocation alors que nourrissage vais garder en attente jusqu'à ce qu'il a tous les arguments nécessaires:
En bref, utiliser l'application partielle pour pré-remplir certaines valeurs, sachant que la prochaine fois que vous appelez la méthode, il va exécuter, laissant undefined tous démunies arguments; utilisation de nourrissage lorsque vous voulez revenir sans cesse partiellement appliqué à la fonction autant de fois que nécessaire pour remplir la signature de la fonction. Un dernier exemple artificiel:
Espérons que cette aide!
Mise à JOUR: Certaines langues ou lib implémentations vous permettra de passer une arité (nombre total d'arguments dans l'évaluation finale) pour l'application partielle de la mise en œuvre qui peut amalgame entre mes deux descriptions dans un mélange confus...mais à ce point, les deux techniques sont largement interchangeables.
OriginalL'auteur sunny-mittal
Réponse Simple
Curry: vous permet d'appeler une fonction, de le fractionner en de multiples appels, fournir un argument par appel.
Partielle: vous permet d'appeler une fonction, de le fractionner en de multiples appels, offrant de multiples arguments par appel.
Conseils tout simples
Les deux vous permettent d'appeler une fonction en fournissant moins d'arguments (ou, mieux, de leur fournir de façon cumulative). En fait, les deux d'entre eux se lier à chaque appel) une valeur spécifique à certains arguments de la fonction.
La vraie différence peut être vu lorsque la fonction dispose de plus de 2 arguments.
Simple e(c)(échantillon)
(en Javascript)
pourquoi toujours passer les arguments, comme le contexte et les rappels, si ils seront toujours la même? Juste lier certaines valeurs pour la fonction
et de l'appeler sur sujet1 et foobar avec
Confortable, n'est-ce pas?
Avec nourrissage vous auriez besoin pour passer un argument à la fois
Avertissement
J'ai sauté tous les universitaires/explication mathématique. Car je ne sais pas. Peut-être qu'il a aidé à
OriginalL'auteur Kamafeather
Il existe d'autres bons de réponses ici, mais je crois que cet exemple (selon ma compréhension) en Java peut être bénéfique pour certaines personnes:
Alors lancer vous donne un argument une fonction pour créer des fonctions, lorsqu'une partie-application crée une fonction wrapper dur codes un ou plusieurs arguments.
Si vous souhaitez copier&coller, le suivant est plus bruyant mais plus convivial pour travailler avec car les types sont plus clémentes:
OriginalL'auteur ArtB
En écrivant cela, j'ai confondu nourrissage et uncurrying. Ils sont les transformations inverses sur les fonctions. Il n'a vraiment pas d'importance ce que vous appelez qui, aussi longtemps que vous obtenez ce que la transformation et de son inverse représentent.
Uncurrying n'est pas défini très clairement (ou plutôt, il y a "conflit" les définitions de tous les capturer l'esprit de l'idée). En gros, cela signifie transformer une fonction qui prend plusieurs arguments dans une fonction qui prend un seul argument. Par exemple,
Maintenant, comment voulez vous transformer en une fonction qui prend un seul argument? Vous tentez de tricher, bien sûr!
Avis que plus maintenant prend un seul argument (qui est composé de deux choses). Super!
Quel est le point de tout cela? Eh bien, si vous avez une fonction qui prend deux arguments, et vous avez une paire d'arguments, il est bon de savoir que vous pouvez appliquer la fonction aux arguments, et toujours obtenir ce que vous attendez. Et, en fait, de la plomberie pour faire ce qu'il existe déjà, de sorte que vous n'avez pas à faire des choses comme l'explicite le pattern matching. Tout ce que vous avez à faire est de:
Donc, qu'est-ce que partielle de la fonction de demande? C'est une façon différente à son tour une fonction à deux arguments dans une fonction avec un argument. Il fonctionne différemment. Encore une fois, prenons (+) comme un exemple. Comment pourrions-nous nous transformer en une fonction qui prend un Int en argument? On triche!
C'est la fonction qui ajoute un zéro à n'importe quel Int.
ajoute 1 à un Int. Etc. Dans chacun de ces cas, (+) est "partiellement".
OriginalL'auteur nomen
Je vais supposer que la plupart des gens qui posent cette question sont déjà familiers avec les concepts de base de sorte que leur est pas nécessaire d'en parler. C'est le chevauchement est la confusion de la partie.
Vous pourriez être en mesure d'utiliser pleinement les concepts, mais de les comprendre en même temps que cette pseudo-atomiques amorphe flou conceptuel. Ce qui manque c'est de savoir où la frontière entre eux est.
Au lieu de définir ce que chacun d'eux, il est plus facile de mettre en évidence leurs différences—les frontières.
Nourrissage est quand vous définir la fonction.
Application partielle est quand vous appel la fonction.
Application est des maths, de l'appel d'une fonction.
Partielle application nécessite l'appel d'un curry de fonction et d'obtenir une fonction comme type de retour.
OriginalL'auteur Brennan Cheung