155 votes

Avantages de programmation apatride ?

J'ai récemment été l'apprentissage de la programmation fonctionnelle (spécifiquement Haskell, mais j'ai traversé des tutoriels sur le langage Lisp et Erlang). Alors que je trouve les concepts très instructif, je ne vois toujours le côté pratique de la "sans effets secondaires" concept. Quels sont les avantages pratiques? Je vais essayer de penser de la fonctionnelle de la mentalité, mais il y a certaines situations qui semblent trop complexes, sans la possibilité d'enregistrer l'état d'une manière facile (je ne considère pas Haskell monades "facile").

Est-ce la peine de continuer à apprendre Haskell (ou un autre point de vue purement fonctionnel de la langue) en profondeur? Est fonctionnel ou apatrides, de la programmation, en fait, plus productive que la procédure? Est-il probable que je vais continuer à utiliser Haskell ou un autre langage fonctionnel plus tard, ou devrais-je apprendre que pour la compréhension?

J'ai moins de soins sur la performance de la productivité. Donc, je vais principalement me demandant si je vais être plus productif dans un langage fonctionnel qu'une procédure orientée objet/whatever.

193voto

Juliet Points 40758

Lire la Programmation Fonctionnelle en un Mot.

Il y a beaucoup d'avantages pour les apatrides de programmation, pas moins de ce qui est considérablement multithread et simultanées de code. Pour dire les choses crûment, mutable état est l'ennemi du code multithread. Si les valeurs sont immuables par défaut, les programmeurs n'ont pas besoin de s'inquiéter d'un thread la mutation de la valeur d'un état partagé entre deux threads, donc il élimine toute une classe de multithreading bugs liés à des conditions de course. Depuis il n'y a pas de conditions de course, il n'y a pas de raison d'utiliser des verrous, de sorte que l'immutabilité élimine un autre ensemble de la classe de bugs liés à des blocages.

C'est la grande raison pour laquelle la programmation fonctionnelle des questions, et probablement le meilleur pour sauter sur la programmation fonctionnelle en train. Il y a aussi beaucoup d'autres avantages, y compris simplifié de débogage (c'est à dire des fonctions qui sont purs et ne pas muter de l'état dans d'autres parties de l'application), plus laconique et expressive de code, moins de code réutilisable par rapport aux langues qui sont fortement tributaires de modèles de conception, et le compilateur ne peut plus agressive optimiser votre code.

54voto

Norman Ramsey Points 115730

Plus les morceaux de votre programme sont apatrides, les moyens plus il y a de mettre les pièces ensemble sans avoir rien casser. La puissance de la apatrides paradigme ne se trouve pas dans les cas d'apatridie (ou pureté) en soi, mais la capacité qu'il vous donne pour écrire puissant, réutilisable fonctions et de les combiner.

Vous pouvez trouver un bon tuto avec beaucoup d'exemples dans John Hughes, le papier Pourquoi la Programmation Fonctionnelle Questions (PDF).

Vous serez paraisons plus productif, surtout si vous choisissez un langage fonctionnel qui a aussi des types de données algébriques et le pattern matching (Caml, SML, Haskell).

20voto

Ray Hidayat Points 7961

De nombreuses autres réponses ont mis l'accent sur la performance (parallélisme) du côté de la programmation fonctionnelle, qui, je crois, est très important. Cependant, vous n'avez poser des questions sur la productivité, comme dans, votre programme peut-il la même chose plus vite dans un paradigme fonctionnel que dans un impératif de paradigme.

Je trouve (par expérience personnelle) que les émissions en F# correspond à la façon dont je pense que mieux, et il est donc plus facile. Je pense que c'est la plus grande différence. J'ai programmé dans les deux F# et C#, et il y a beaucoup moins de "lutte contre la langue" en F#, que j'aime. Vous n'avez pas à penser aux détails en F#. Voici quelques exemples de ce que j'ai trouvé, j'ai vraiment apprécier.

Par exemple, même si le F# est statiquement typé (tous les types sont résolus au moment de la compilation), l'inférence de type chiffres de quel type que vous avez, de sorte que vous n'avez pas à le dire. Et si il ne peut pas comprendre, c'rend automatiquement votre fonction/classe/quel que soit générique. Vous n'avez donc jamais à écrire le générique que ce soit, tout est automatique. Je trouve cela signifie que je vais passer plus de temps à réfléchir au problème et de moins en moins comment la mettre en œuvre. En fait, chaque fois que je reviens à C#, je trouve que je manque vraiment cette inférence de type, vous n'avez jamais à comprendre comment distraire, il est tant que vous n'avez pas besoin de faire plus.

Aussi en F#, au lieu d'écrire des boucles, vous pouvez appeler les fonctions. C'est un changement subtil, mais significative, parce que vous n'avez pas à penser à propos de la boucle de construire plus. Pour exemple, voici un morceau de code qui permettrait de passer et de correspondre à quelque chose (je ne me souviens pas quoi, c'est à partir d'un projet Euler puzzle):

let matchingFactors =
    factors
    |> Seq.filter (fun x -> largestPalindrome % x = 0)
    |> Seq.map (fun x -> (x, largestPalindrome / x))

Je me rends compte que faire un filtre puis une carte (c'est une conversion de chaque élément) en C# serait assez simple, mais vous devez penser à un niveau inférieur. En particulier, vous devriez écrire la boucle elle-même, et vous avez votre propre explicite si la déclaration, et ce genre de choses. Depuis qu'il a appris F#, j'ai réalisé que j'ai trouvé plus facile à code dans la manière fonctionnelle, où si vous voulez filtrer, vous écrivez "filtre", et si vous voulez la carte, vous écrivez "la carte", au lieu de la mise en œuvre de chacun des détails.

J'aime aussi l' |> opérateur, qui, je pense, sépare F# à partir de ocaml, et peut-être d'autres langages fonctionnels. C'est le tube de l'opérateur, il vous permet de "pipe" de la sortie d'une expression dans l'entrée d'une autre expression. Elle rend le code de suivre la façon dont je pense de plus. Comme dans l'extrait de code ci-dessus, en disant: "prenez les facteurs de la séquence, le filtre, puis la carte". C'est d'un très haut niveau de réflexion, que vous n'en faites pas un language de programmation impératif, parce que vous êtes tellement occupé à l'écriture de la boucle et si les déclarations. C'est la seule chose qui me manque le plus quand je vais dans une autre langue.

Donc, juste en général, même si je programme en C# et F#, je le trouve plus facile à utiliser F# parce que vous pouvez penser à un niveau plus élevé. Je dirais que, parce que les plus petits détails sont retirés de la programmation fonctionnelle (en F#, au moins), que je suis plus productif.

Edit: j'ai vu dans un des commentaires que vous avez demandé un exemple de "l'état" dans un langage de programmation fonctionnel. F# peut être écrite de manière impérative, voici donc un exemple concret de la façon dont vous pouvez avoir mutable état en F#:

let mutable x = 5
for i in 1..10 do
    x <- x + i

15voto

Brian Points 82719

Pensez à tous les difficile de bugs que vous avez passé un long temps de débogage.

Maintenant, combien de ces bugs ont été en raison de mauvaises interactions" entre les deux composantes distinctes d'un programme? (Presque tous les threading bugs ont cette forme: les courses d'écriture de données partagée, blocages, ... en Outre, il est fréquent de trouver des bibliothèques qui ont un effet inattendu sur l'état global, ou en lecture/écriture du registre/environnement, etc.) Je voudrais poser au moins 1 en 3 'dur bugs" tombent dans cette catégorie.

Maintenant, si vous passez à apatrides/immuables/pure programmation, tous ces bugs disparaissent. Vous êtes présenté avec de nouveaux défis à la place (par exemple, lorsque vous ne souhaitez que différents modules pour interagir avec l'environnement), mais dans une langue comme Haskell, ces interactions obtenir explicitement réifiée dans le système de type, ce qui signifie que vous pouvez juste regarder le type de la fonction et de la raison sur le type d'interactions qu'il peut avoir avec le reste du programme.

C'est la grande victoire de "l'immuabilité' OMI. Dans un monde idéal, nous aimerions tous de la conception fantastique Api et même quand les choses ont été mutables, les effets local et bien documentées et "inattendue" interactions seraient maintenus à un minimum. Dans le monde réel, il y a beaucoup d'Api qui interagissent avec l'état global d'une multitude de manières, et ceux-ci sont la source de la plus pernicieuse de bugs. Aspirant à l'apatridie est l'aspirant à se débarrasser de ces/implicite/derrière-le-scènes les interactions entre les composants.

7voto

Zifre Points 14109

Sans État, il est très facile de paralléliser automatiquement votre code (comme processeurs sont faits avec plus et plus de cœurs, c’est très important).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X