8
votes

Programmation fonctionnelle pour les algorithmes de base

Quelle est la qualité de la programmation fonctionnelle "pure" pour les implémentations de routine de base, par exemple Lister le tri, la corde correspondant, etc.?

Il est courant de mettre en œuvre de telles fonctions de base dans l'interprète de base de tout langage fonctionnel, ce qui signifie qu'ils seront écrits dans une langue impérative (C / C ++). Bien qu'il y ait de nombreuses exceptions près.

au moins, je tiens à demander: à quel point il est difficile d'émuler de style impératif tout en codant dans la langue fonctionnelle «pure»?


4 commentaires

Vous demandez à quel point il est difficile d'imiter un style tout en écrivant dans un autre?


L'hypothèse selon laquelle une langue fonctionnelle sera mise en œuvre en utilisant un impératif est suspecte. OCAML est écrit à OCAML et la mise en œuvre la plus populaire de Haskell (GHC) est écrite à Haskell.


@Shreeevatsar: Peut-être que je devrais reformuler, mais c'est ce que je demande. Dans quelle mesure est-il difficile d'écrire des programmes impératifs tout en codant dans une langue fonctionnelle pure sans constructions spéciales telles que «Prunn», «faire» ... Par exemple, c'est un astuce connu que les programmes fonctionnels peuvent imiter l'état «impératif» avec l'utilisation des fermetures. C'est ce que je demandais.


L'idée que fonctionnelle et impérative sont des opposés doivent être dissipées. Haskell est purement fonctionnel et fait également un très bon langage de programmation impératif.


6 Réponses :


0
votes

Cela fonctionne assez bien l'inverse de l'autre sens de l'émulation de fonctionnaire avec un style impératif.

N'oubliez pas que l'interne d'un interprète ou de la machine virtuelle est si proche du métal et de la performance critique que vous devriez même envisager d'aller au niveau et comptez les cycles d'horloge pour chaque instruction (comme SmallTalk Dophin le fait et les résultats sont impressionnant). Les CPU sont impératifs.

Mais il n'y a pas de problème à faire toute la mise en œuvre de l'algorithme de base - celle que vous mentionnez est pas bas niveau - ce sont des bases.


0 commentaires

1
votes

Presque toutes les langages de programmation fonctionnelle ont une certaine construction pour permettre un codage impératif (comme faire à Haskell). Il existe de nombreux domaines problématiques qui ne peuvent pas être résolus avec une programmation fonctionnelle "pure". L'un de ceux-ci est des protocoles réseau, par exemple où vous besoin une série de commandes dans le bon ordre. Et de telles choses ne se prêtent pas bien à la programmation fonctionnelle pure.

Je dois être d'accord avec Lothar , cependant, cette liste La correspondance de tri et de chaîne ne sont pas vraiment des exemples que vous devez résoudre impérativement. Il existe des algorithmes bien connus pour de telles choses et ils peuvent être mis en œuvre efficacement dans des langues fonctionnelles déjà.


2 commentaires

Je comprends. Je ne voulais pas mentionner les cas où «l'état» et «l'impératif» sont nécessaires par définition (comme votre exemple avec des protocoles de réseautage); Juste des tâches de calcul de base, où l'objectif est de calculer la fonction. La proposition actuelle est donc que nous pouvons facilement écrire un algorithme fonctionnel pur pour de telles choses?


Vous pouvez, mais vous pouvez l'écrire (presque) purement impératif si vous êtes enclin à faire. Mon exemple a simplement souligné quelque chose où le style impératif est absolument nécessaire pour le faire fonctionner correctement. Rien ne vous empêche d'utiliser les mêmes mécanismes pour d'autres choses.



1
votes

Je pense que les "algorithmes" (par exemple les organes de méthodes et les structures de données de base) sont les suivants: la programmation fonctionnelle est la meilleure. En supposant que les excels de programmation fonctionnelle de manière totalement dépendante de l'État sont des algorithmes et des structures de données, entraînant souvent un code plus court / simple / nettoyant que vous ne recevrez une solution impérative. (Ne pas imiter le style impératif, le style FP est préférable pour la plupart de ces types de tâches.)

Vous voulez que des trucs impératifs parfois traitent des performances IO ou de bas niveau, et que vous souhaitez que vous puissiez partitionnement de la conception et de l'architecture de haut niveau d'un grand programme, mais "dans le petit" où vous écrivez la plus grande partie de votre code, FP est une victoire.

Voir aussi

Comment la programmation fonctionnelle affecte-t-elle la structure de votre code?


1 commentaires

L'article et l'exemple de cela ne se persuadent pas assez persuasif, mais c'est mon avis. Merci de fournir la référence, de toute façon.



0
votes

Je ne sais pas sur la liste de tri de la liste, mais vous seriez fortement pressé de bootstrapp une langue sans une sorte de chaîne correspondant dans le compilateur ou l'exécution. Vous avez donc besoin de cette routine pour créer la langue. Comme il n'y a pas beaucoup de points d'écriture deux fois au même code, lorsque vous créez la bibliothèque pour faire correspondre des chaînes dans la langue, vous appelez le code écrit plus tôt. La mesure dans laquelle cela se produit dans des versions successives dépendra de la manière dont l'accueil de la langue est-il, mais à moins que ce soit un objectif de conception fort, il n'y aura aucune raison de le changer.


2 commentaires

Oui, je réalise le besoin de nombreuses fonctions intégrées; Mais ma question actuelle était: faites-ils tous doivent être écrits en C / C ++ (qui est impératif)? Désolé de corriger.


Non, vous pouvez les écrire à l'assembleur ou quoi que ce soit d'autre que la plate-forme soutient déjà.



7
votes

1) bon par quelle standard? Quelles propriétés désirez-vous?

Tri de liste? Facile. Faisons Quicksort dans HASKELLL: P>

do {
  putStrLn "What's your name?";
  name <- getLine;
  putStrLn ("Hello, " ++ name);
}


6 commentaires

Je pense que pour ce Quicksort, vous vouliez filtre plutôt que trouver . Pour trier [4, 1, 7, 0] , le premier trouver retournera juste 1 alors que filtre serait ont retourné [1, 0] .


Votre implémentation de tri rapide est incorrecte - Impossible de faire correspondre le type attendu [a] 'contre le type inféré peut-être A1'.


Désolé, Artagnon. S / Trouver / Filtre / g


Bonne réponse, mais l'essence de la programmation impérative ne concerne pas l'exécution séquentielle du programme, mais plus sur l'état de manipulation. Quoi qu'il en soit, votre Quicksort est juste bien.


Bubba88, la programmation impérative est à propos de "fais-le, puis de le faire". Il s'agit des impératifs. Il arrive tellement que vous ne pouvez pas "faire" quelque chose d'intéressant sans séquencer dans une sorte d'état.


do {x <- [1,2]; Y <- ['A', 'B']; retour (x, y); } - Ce programme impératif donne [(1, 'A'), (1, 'B'), (2, 'A'), (2, 'B') . C'est aussi une fonction pure.