Selon ma compréhension, les fonctions partielles sont des fonctions que nous obtenons en passant moins de paramètres à une fonction que prévu. Par exemple, si cela était directement valide en Python:
>>> def add(x,y):
... return x+y
...
>>> new_function = add(1)
>>> new_function(2)
3
Dans l'extrait ci-dessus, new_function
est une fonction partielle. Cependant, selon le Haskell Wiki , la définition de la fonction partielle est
Une fonction partielle est une fonction qui n'est pas définie pour tous les arguments possibles du type spécifié.
alors, ma question est: qu'est-ce qu'on entend exactement par "fonction partielle"?
python
haskell
functional-programming
partial-application
partial-functions
Saurabh kukade
la source
la source
partial
effectue une application partielle , tandis que Haskell le fait automatiquement. L'entrée wiki fait référence aux fonctions partielles , qui est un terme issu des mathématiques.add 3 5
n'est pas une application à fonction unique. Cela s'applique d'abordadd
à 3 pour obtenir une nouvelle fonction, qui est ensuite appliquée à 5.partial
méthode est une déclaration directe d'une méthode privée éventuellement implémentée ailleurs dans la base de code du projet.new_function = functools.partial(add, 1)
Réponses:
Vous confondez ici deux concepts. Une fonction partiellement appliquée [haskell-wiki] avec une fonction partielle [haskell-wiki] .
Une fonction partiellement appliquée est:
alors qu'une fonction partielle est en effet une fonction non totale:
la source
Une fonction partielle (à la fois dans le contexte de la programmation fonctionnelle et des mathématiques) est exactement ce que dit le wiki: une fonction non définie pour tous ses arguments possibles. Dans le contexte de la programmation, nous interprétons généralement "non défini" comme l'une des nombreuses choses, y compris le comportement indéfini, les exceptions ou la non-terminaison.
Un exemple de fonction partielle serait la division entière, qui n'est pas définie si le diviseur est 0 (dans Haskell, il générera une erreur).
Ce code provoquerait simplement une erreur en Python, mais s'il fonctionnait comme vous le souhaitiez, ce serait une fonction totale (c'est-à-dire non partielle).
Comme les commentateurs l'ont déjà souligné, vous pensez très probablement au fait que ce serait une fonction partiellement appliquée .
la source
Les réponses expliquent tout, je vais juste ajouter un exemple dans chaque langue:
ce n'est ni une fonction partielle ni une fonction curry , c'est seulement une fonction à laquelle vous n'avez pas donné tous ses arguments .
Une fonction curry en python devrait ressembler à ceci:
et à haskell:
Une fonction partielle en python:
Et à Haskell, comme votre lien l'a montré:
Eh bien, fondamentalement le contraire: c'est une fonction qui fonctionnera pour n'importe quelle entrée de ce type. Voici un exemple en python:
et cela fonctionne même pour des listes infinies, si vous utilisez une petite astuce:
Et l'équivalent en Haskell:
Ici, les fonctions ne se bloquent pas pour toujours. Le concept est le même: pour chaque liste, la fonction fonctionnera.
la source