86 votes

Ruby est-il un langage fonctionnel ?

Wikipedia dit que Ruby est un langage fonctionnel, mais je n'en suis pas convaincu. Pourquoi ou pourquoi pas ?

58voto

Tony Morris Points 2304

Le fait qu'une langue soit ou non une langue fonctionnelle n'a pas d'importance. La programmation fonctionnelle est une thèse, mieux expliquée par Philip Wadler (The Essence of Functional Programming) et John Hughes (Why Functional Programming Matters).

Une question pertinente est la suivante : "Dans quelle mesure Ruby permet-il de réaliser la thèse de la programmation fonctionnelle ? La réponse est "très peu".

J'ai donné une conférence sur ce sujet récemment. Voici les diapositives.

34voto

Mike Points 1186

Ruby supporte des fonctions de plus haut niveau (voir Array#map, inject, & select), mais il s'agit toujours d'un langage impératif, orienté objet.

L'une des principales caractéristiques d'un langage fonctionnel est qu'il évite les états mutables. Les langages fonctionnels n'ont pas le concept de variable comme c'est le cas en Ruby, C, Java ou tout autre langage impératif.

Une autre caractéristique clé d'un langage fonctionnel est qu'il se concentre sur la définition d'un programme en termes de "quoi", plutôt que de "comment". Lorsque nous programmons dans un langage OO, nous écrivons des classes et des méthodes pour cacher l'implémentation (le "comment") du "quoi" (le nom de la classe/méthode), mais au final ces méthodes sont toujours écrites en utilisant une séquence d'instructions. Dans un langage fonctionnel, vous ne spécifiez pas de séquence d'exécution, même au niveau le plus bas.

29voto

Mike Stone Points 21293

Je pense vraiment que vous pouvez utiliser le style fonctionnel en Ruby.

L'un des aspects les plus critiques pour pouvoir programmer dans un style fonctionnel est que le langage supporte les fonctions d'ordre supérieur... ce que fait Ruby.

Cela dit, il est également facile de programmer en Ruby dans un style non fonctionnel. Un autre aspect clé du style fonctionnel est de ne pas avoir d'état, et d'avoir de véritables fonctions mathématiques qui renvoient toujours la même valeur pour un ensemble donné d'entrées. Cela peut être fait en Ruby, mais ce n'est pas imposé dans le langage comme quelque chose de plus strictement fonctionnel comme Haskell.

Donc, oui, il prend en charge le style fonctionnel, mais il vous permet également de programmer dans un style non fonctionnel.

16voto

Chris Vest Points 5622

Je soutiens que le fait de supporter, ou d'avoir la capacité de programmer dans un langage fonctionnel style ne fait pas un langage fonctionnel.

Je peux même écrire du code Java dans un style fonctionnel si je veux blesser mes collègues et moi-même un peu mois semaines sur.

Avoir un langage fonctionnel n'est pas seulement une question de ce que vous peut comme les fonctions d'ordre supérieur, les fonctions de première classe et le currying. Il s'agit également de ce que vous ne peut pas faire, comme les effets secondaires dans les fonctions pures.

C'est important car c'est en grande partie la raison pour laquelle les programmes fonctionnels sont, ou le code fonctionnel en générique est, plus facile à raisonner. Et lorsque le code est plus facile à raisonner, les bogues deviennent moins profonds et flottent vers la surface conceptuelle où ils peuvent être corrigés, ce qui donne un code moins bogué.

Ruby est essentiellement orienté objet, et même s'il supporte assez bien le style fonctionnel, il n'est pas en soi un langage fonctionnel.

C'est en tout cas mon opinion non scientifique.

Edit : En rétrospective et en tenant compte des excellents commentaires que j'ai reçus jusqu'à présent sur cette réponse, je pense que la comparaison entre l'orienté objet et le fonctionnel est une comparaison entre des pommes et des oranges.

Le véritable facteur de différenciation est le fait d'être impartial dans l'exécution, ou non. Les langages fonctionnels ont l'expression comme principale construction linguistique et l'ordre d'exécution est souvent indéfini ou défini comme paresseux. L'exécution stricte est possible mais n'est utilisée que si nécessaire. Dans un langage impartial, l'exécution stricte est la valeur par défaut et si l'exécution paresseuse est possible, elle est souvent maladroite et peut donner des résultats imprévisibles dans de nombreux cas limites.

Maintenant, c'est mon opinion non-scientifique.

9voto

skymt Points 2156

Ruby est un langage multi-paradigme qui supporte un style de programmation fonctionnel.

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