Les fonctions d'ordre supérieur fournissent-elles plus de puissance à la programmation fonctionnelle?

13

J'ai posé une question similaire sur cstheory.SE .

Selon cette réponse sur Stackoverflow, il existe un algorithme qui, sur un langage de programmation fonctionnel pur non paresseux, a une complexité , tandis que le même algorithme en programmation impérative est Ω ( n ) . Ajouter la paresse au langage FP rendrait l'algorithme Ω ( n ) .Ω(nlogn)Ω(n)Ω(n)

Existe-t-il une relation équivalente comparant un langage FP avec et sans fonctions d'ordre supérieur? Est-ce toujours Turing complet? Si c'est le cas, le manque d'ordre supérieur sur la PF rend-il le langage moins "puissant" ou efficace?

vz0
la source
Quelle langue FP?
reinierpost
Les fonctions d'ordre supérieur et l'évaluation paresseuse ne sont pas les mêmes, afaik. Alors, quelle est votre question?
Raphael

Réponses:

11

Dans un langage de programmation fonctionnel suffisamment puissant (par exemple, avec des types de données pour implémenter des fermetures ), vous pouvez éliminer toutes les utilisations d'ordre supérieur par la transformation de la défonctionnalisation . Comme cette méthode est utilisée pour compiler ce type de langage, vous pouvez raisonnablement supposer que cela n'affecte pas les performances et que dans ce paramètre, un ordre supérieur ne rend pas le langage moins puissant. Cependant, cela affecte la façon d'écrire du code.

Cependant, si le langage n'est pas assez puissant, alors oui, un ordre supérieur fournit un pouvoir expressif. Considérez le lambda-calcul: sans fonction d'ordre supérieur, il ne peut vraiment rien faire, principalement parce que les types de données les plus basiques (entiers, booléens) sont implémentés à l'aide de fonctions.

En conclusion, cela dépend vraiment de la langue.


Ci-dessus est ma réponse. Ci-dessous, un commentaire sur une hypothèse habituelle sur les langues impératives.

sur un algorithme qui sur un langage de programmation fonctionnel non paresseux a une complexité , tandis que le même algorithme en programmation impérative est Ω ( n ) . Ajouter la paresse au langage FP rendrait l'algorithme Ω ( n ) .Ω(nJournaln)Ω(n)Ω(n)

Je voudrais voir cette référence. L'hypothèse habituelle est qu'un accès à un tableau de longueur dans une RAM est au temps O ( 1 ) et l'équivalent en FP pur est au temps O ( log n ) . Ce n'est pas tout à fait vrai: le temps d'accès dans une RAM est en O ( log m )m est la taille de la mémoire. Bien sûr, m n . En pratique, l'accès à un élément d'un tableau est beaucoup plus rapide. Une raison serait que m est borné mais ... tout comme n !nO(1)O(Journaln)O(Journalm)mmnmn

EDIT: merci pour le lien (le lien pour l'article sur la paresse n'est pas disponible, en voici un autre ). Comme indiqué dans les commentaires et ci-dessus dans ma réponse, le modèle de RAM est un peu injuste envers le FP pur en fournissant des recherches même lorsque la taille d'une adresse n'est pas limitée. Je n'ai pas encore compris comment fonctionne le paresseux, mais je pense qu'il est important de noter que ce n'est que pour ce problème particulier.O(1)

jmad
la source
4

Cela dépend de ce que vous entendez par expressivité.

Voici un argument selon lequel l'ordre supérieur ajoute quelque chose: avec les langages de premier ordre, la récursion primitive ne suffit pas pour exprimer la fonction Ackermann . Cependant, en présence de fonctions d'ordre supérieur, la récursion primitive suffit:

Ackermann 0=λX.X+1Ackermann (m+1)=Iter (Ackermann m)Iter F 0=F 1Iter F (n+1)=F (Iter F n)

Ceci définit la fonction Ackermann en utilisant uniquement la récursion primitive.

IterIterest d'ordre supérieur. Dans la théorie conventionnelle de la récursivité, toutes les fonctions définissables ont un typeNkN pour certains k, tandis que Iter a un type (NN)(NN).

Martin Berger
la source