10
votes

Programmation fonctionnelle en C ++ 11, F # Style

Je regarde les nouvelles fonctionnalités de C ++ 11 et on dirait vraiment qu'il sera possible de programmer dans un style de programmation très fonctionnel en l'utilisant. J'ai été utilisé pour utiliser la liste des types, SEQ, la matrice en F # et je ne vois aucune raison pour que leurs membres ne puissent pas être portés dans une sorte de modèle C ++ 11. Quels problèmes ou quels avantages voyez-vous dans l'utilisation de C ++ 11 vs quelque chose comme F # pour un style de programmation fonctionnel mixte? Peut-être que les gars de boost feront un nouveau fonctionnel une fois C ++ 11 sort.


1 commentaires

La référence que vous indiquez (l'algorithme STL, qui n'est pas une classe BTW) concerne une en-tête déjà présente et standard en C ++. C'est-à-dire rien de nouveau. La nouvelle norme C ++ facilite simplement la création des foncteurs passés aux algorithmes déjà existants.


5 Réponses :


0
votes

J'imagine que ce serait ... Intéressant ... Pour mettre en œuvre certaines optimisations communes aux langues fonctionnelles de C ++ 0x (comme une élimination commune de subexpression).


1 commentaires

La plupart des compilateurs C et C ++ font CSE et GCSE. Ce n'est pas le problème. Le problème implique une application de fonction partielle et une récursion de la queue.



15
votes

Le plus gros problème d'essayer de programmer dans un style fonctionnel en C ++ est qu'il ne prend pas en charge la récursion de la queue. Dans une langue fonctionnelle, vous n'avez pas à vous soucier de l'explosion de la pile lorsque vous avez la queue recueille correctement, mais en C ++, vous devez toujours vous inquiéter de cela. Par conséquent, de nombreux algorithmes de type "fonctionnels" seront maladroits ou lourds.


4 commentaires

Pas tout à fait vrai. Les compilateurs C ++ les plus populaires d'aujourd'hui manipuleront correctement la récursion de la queue, bien que vous souhaitions à spécifier des drapeaux d'optimisation supplémentaires tels que «-O2».


C'est vrai. Indépendamment de ce qu'un compilateur peut faire comme une optimisation, la langue ne fournit pas d'installations pour cette fonctionnalité. Selon elle est dangereuse.


Le problème est que Raii n'est pas compatible avec l'optimisation des appels de queue. Le même problème existe dans F # avec essayer ... Enfin, mais il est plus évident en raison de la explicite de la construction.


Pas vrai. Le compilateur convertit un appel queue en boucle et les boucles fonctionnent bien avec Raii. Vous devez exercer un jugement, mais c'est vrai de chaque langue.



5
votes

1 commentaires

Merci! Un point de départ pour une mise en œuvre complète serait la gamme de Boost et les bibliothèques d'itérateurs, une combinaison des deux.



3
votes

Quels problèmes d'avantages voyez-vous à utiliser C ++ 0x vs quelque chose comme F # pour un style de programmation fonctionnel mixte?

Le Problème de Funarg ascendant , qui a été débattu dans le contexte de Lisp il y a 40 ans !


0 commentaires

6
votes

Voici quelques-uns des problèmes que j'ai rencontrés en essayant d'écrire du code fonctionnel dans C #, mélangé à quelques friandises de mon temps lorsque j'utilisais toujours C ++:

  1. manque de motif correspondant. Une fois que vous vous y êtes habitué, n'acceptez pas cela peut me conduire fou.
  2. manque de sucre syntaxique pour les tuples.
  3. manque de syntaxe pour copier des archives et définir des champs en une fois.
  4. manque de syntaxe pour les listes et les tableaux. Qui va pour les constructeurs et la correspondance de modèle.
  5. ne pas avoir de GC et d'accès à la mémoire dangereuse. Ne pas être contraint par un GC est un avantage, mais se souvenir des rapports que j'ai obtenus de mes premières manches de Valgrind sur le code C ++, je pensais que c'était que le virus ne m'a pas fait peur pour toujours.
  6. Comprendre le code de modèle n'est pas exactement accessible à tous les mortels. Je n'ai pas de problème à comprendre le mien, mais chaque fois que j'ai examiné les implémentations de la STL, Boost ou CGAL, je me suis retrouvé à me demander quelle langue ils utilisaient. Mon C ++ et leur C ++ ne vivent pas dans le même monde.
  7. Le manque total de plaisir dans la gestion d'une bibliothèque qui utilise une autre version de Boost (ou de toute bibliothèque utilisant des modèles).
  8. Verbosité des fichiers d'en-tête / implémentation séparés.
  9. Type Inference en C ++ ne va pas aussi loin que par exemple. F#. Je sais que cela a été amélioré en C ++ 11, mais si je comprends bien, il est similaire à Var en C #, ce qui ne suffit pas une fois que vous avez goûté à la perférence F # -Style.
  10. manque d'expressions de calcul, y compris expressions de séquence, compréhensions, asynchrone ...

    Cela ne me surprendrait pas si plusieurs de ces points étaient réellement possibles en C ++ en utilisant un modèle et un préprocesseur magique, mais vous ne pouvez pas vraiment les utiliser dans un environnement de production, à moins que vous n'ayez de collègues très aventureux et tolérants.

    J'étais un passionné de Die-Hard C ++ avant. Ensuite, j'ai commencé à utiliser des programmations génériques avec des modèles et des fonctions d'ordre supérieur à l'aide d'objets de fonction. Il était juste trop fatigant d'écrire. Après avoir essayé une langue fonctionnelle, je n'ai jamais regardé en arrière.


0 commentaires