Est Ruby, un langage fonctionnel?
Wikipédia dit que Ruby est un langage fonctionnel, mais je ne suis pas convaincu. Pourquoi ou pourquoi pas?
- Pourquoi tous les votes contre?
- Probablement parce que votre question est très courte, bien que personnellement je n'ai pas de problème avec ça du tout!
- Il y a déjà de bonnes réponses, juste pour compléter, une paire de contenu que de discuter de la PF et de Rubis: code.google.com/p/tokland/wiki/RubyFunctionalProgramming slideshare.net/tokland/functional-programming-with-ruby-9975242
- Si quelqu'un est intéressé par ce sujet, s'il vous plaît regarder cette et vous apprendrez comment ruby peut être utilisé de façon fonctionnelle, ce que les racines de la programmation fonctionnelle, pourquoi ruby n'est pas un langage fonctionnel, même si il est capable d'fonctionnelle du programme: youtube.com/watch?v=5ZjwEPupybw
Vous devez vous connecter pour publier un commentaire.
J'ai le plus certainement penser que vous pouvez utiliser style fonctionnel en Ruby.
L'un des aspects les plus critiques pour être en mesure de programmer dans un style fonctionnel est si la langue prend en charge des fonctions d'ordre supérieur... qui Ruby n'.
Cela dit, il est facile de programmer en Ruby dans un non-fonctionnelle de style ainsi. Un autre aspect clé de la fonctionnelle de style est de ne pas avoir d'état, et ont de réelles fonctions mathématiques qui retourne toujours la même valeur pour un ensemble donné d'intrants. Cela peut être fait en Ruby, mais elle n'est pas appliquée dans la langue comme quelque chose de plus strictement fonctionnelle comme Haskell.
Donc, oui, il prend en charge fonctionnelle de style, mais il sera également vous permettre de programmer dans un non-fonctionnelle de style ainsi.
Is ruby a functional language?
et dans un droit de réponse est un simple non. Ruby est un langage Orienté Objet avec certaines caractéristiques fonctionnelles.Si une langue est ou n'est pas un langage fonctionnel est sans importance. La Programmation fonctionnelle est une thèse, mieux expliquée par Philip Wadler (L'Essence de la Programmation Fonctionnelle) et de John Hughes (Pourquoi Programmation Fonctionnelle des Questions).
Une véritable question est de savoir " Comment se prêtent est Ruby pour la réalisation de la thèse de la programmation fonctionnelle?' La réponse est "très mal'.
J'ai donné une conférence sur ce tout récemment. Voici les diapositives.
Ruby prend en charge les fonctions supérieures (voir Tableau#map, injecter, & choix), mais il est toujours impératif, langage Orienté Objet.
L'une des caractéristiques principales d'un langage fonctionnel, il permet aussi d'éviter mutable état. Les langages fonctionnels n'ont pas la notion de variable que vous auriez en Ruby, C, Java ou tout autre langage impératif.
Une autre caractéristique clé d'un langage fonctionnel, c'est qu'il se concentre sur la définition d'un programme en termes de "quoi", plutôt que "comment". Lors de la programmation dans un langage OO, nous écrire des classes & méthodes pour masquer la mise en œuvre (le "comment") du "quoi" (de la classe, du nom de la méthode), mais à la fin, ces méthodes sont encore écrit à l'aide d'une séquence d'instructions. Dans un langage fonctionnel, vous ne précisez pas la séquence de l'exécution, même au niveau le plus bas.
Je soutiens que, de soutien, ou d'avoir la possibilité de programmer dans un langage fonctionnel style n'est pas un langage fonctionnel faire.
Je peux même écrire du code Java dans un style fonctionnel si je veux de mal à mes collègues et à moi-même un peu
moissemaines.Avoir un langage fonctionnel n'est pas seulement à propos de ce que vous peut faire, comme les fonctions d'ordre supérieur, de première classe de fonctions et de nourrissage. C'est également à ce que vous ne peut pas, comme des effets secondaires dans les fonctions pures.
Ceci est important parce que c'est une grande partie de la raison pour laquelle les programmes fonctionnels sont, ou code fonctionnel dans generel est plus facile de raisonner sur. Et lorsque le code est plus facile de raisonner sur, des bugs de devenir faible et flotter à l'étude de la surface où ils peuvent être fixes, qui à son tour donne moins de code bogué.
Ruby est orienté objet, à la base, donc, même si elle a un bon soutien pour un style fonctionnel, il n'est pas lui-même un langage fonctionnel.
C'est mon non-scientifique avis de toute façon.
Edit:
Rétrospectivement, et avec la considération pour les beaux commentaires que j'ai reçu pour cette réponse jusqu'à présent, je pense que l'orienté objet par rapport fonctionnelle de comparaison est l'une des pommes et des oranges.
Le véritable facteur de différenciation est d'être imparative dans l'exécution, ou pas. Les langages fonctionnels ont l'expression comme leur principal linguistique de la construction et de l'ordre d'exécution est souvent indéfini ou défini comme étant paresseux. La stricte exécution est possible, mais utilisé seulement en cas de besoin. Dans un imparative de la langue, de la stricte exécution est la valeur par défaut et tout paresseux exécution est possible, il est souvent encombrants à faire et peut donner des résultats imprévisibles dans de nombreux cas limites.
Maintenant, c'est mon avis scientifique.
Ruby devra répondre aux exigences suivantes pour être "VRAIMENT" fonctionnelle.
Des valeurs inaltérables: une fois une “variable” est défini, il ne peut pas être modifié. En Ruby, cela signifie que vous avez effectivement pour traiter les variables comme des constantes. Le n'est pas pris en charge intégralement dans la langue, vous aurez à geler chaque variable manuellement.
Pas d'effets secondaires: lorsqu'il est passé d'une valeur donnée, une fonction doit toujours retourner le même résultat. Cela va de pair avec le fait d'avoir des valeurs inaltérables; une fonction qui ne peut pas prendre une valeur et de le changer, car cela pourrait causer un effet secondaire qui est tangent à retourner un résultat.
Fonctions d'ordre supérieur: ce sont des fonctions qui permettent à des fonctions comme arguments, ou utiliser des fonctions comme la valeur de retour. C'est, sans doute, l'une des plus importantes caractéristiques de l'un langage fonctionnel.
Nourrissage: activé par des fonctions d'ordre supérieur, nourrissage est en train de transformer une fonction qui prend plusieurs arguments dans une fonction qui prend un argument. Cela va main dans la main avec la fonction partielle de l'application, qui est la transformation d'un multi-fonction d'argument dans une fonction qui prend moins d'arguments alors qu'à l'origine.
La récursivité: en boucle par l'appel d'une fonction à partir de l'intérieur de lui-même. Lorsque vous n'avez pas accès aux données mutable, la récursivité est utilisée pour construire et de données de la chaîne de construction. C'est parce que la boucle n'est pas une notion fonctionnelle, car elle nécessite de variables pour être passé autour de stocker l'état de la boucle à un moment donné.
Paresseux-évaluation, ou retardée d'évaluation: retarder le traitement de valeurs jusqu'au moment où il est réellement nécessaire. Si, par exemple, vous avez un peu de code qui a généré la liste des nombres de Fibonacci, avec lazy-évaluation est activé, ce ne serait pas en fait être traitées et calculés jusqu'à ce que l'une des valeurs le résultat a été requis par une autre fonction, comme le met.
Proposition (Juste une pensée)
Je serait génial d'avoir une sorte de définition de disposer d'un
mode
directive de déclarer les fichiers avec le paradigme fonctionnel, exemplemode "fonctionnel"
Ruby est un multi-paradigme de la langue qui prend en charge un style fonctionnel de la programmation.
Ruby est un langage orienté-objet, qui peut soutenir d'autres paradigmes (fonctionnel, impératif, etc). Cependant, puisque tout ce qui est en Ruby, c'est un objet, c'est principalement un langage OO.
exemple:
"bonjour".reverse() = "olleh", chaque chaîne est une chaîne instance de l'objet et ainsi de suite et ainsi de suite.
Lire ici ou ici
Cela dépend de votre définition d'un “langage fonctionnel”. Personnellement, je pense que le terme est lui-même très problématique lorsqu'il est utilisé comme un absolu. Le sont des aspects plus d'être un “langage fonctionnel” que de simples fonctionnalités de la langue et de la plupart dépendent de l'endroit où vous êtes à la recherche d'. Par exemple, la culture de la langue est très importante à cet égard. Est-il encourager un style fonctionnel? Que dire de la disposition des bibliothèques? - Ils vous encourageons à les utiliser de manière fonctionnelle?
La plupart des gens appellent le Schéma fonctionnel de la langue, par exemple. Mais qu'en Common Lisp? En dehors de la multiple/unique espace de noms de la question et de la garantie de la queue-appel d'élimination (dont certains CL implémentations de soutien en tant que bien, en fonction de la configuration du compilateur), il n'y en a pas beaucoup qui le rend Régime comme un langage plus adapté à la programmation fonctionnelle de Common Lisp, et encore, la plupart des Lispers ne dirais pas CL un langage fonctionnel. Pourquoi? Parce que la culture qui l'entoure dépend fortement de CL est impératif de fonctionnalités (comme la BOUCLE de macro, par exemple, que la plupart des Intrigants serait probablement froncer les sourcils sur).
D'autre part, un programmeur en C peut très bien considérer CL un langage fonctionnel. La plupart du code écrit en dialecte de Lisp est certainement beaucoup plus fonctionnels dans le style que le votre bloc de code C, après tout. De même, le Schéma est très bien un langage impératif par rapport à Haskell. Par conséquent, je ne pense pas qu'il puisse jamais y avoir une certaine réponse oui/non. Si à l'appel d'un langage fonctionnel ou non dépend fortement de votre point de vue.
Ruby n'est pas vraiment beaucoup d'un multi-paradigme de la langue, je pense. Multi-paradigme tend à être utilisé par des personnes qui voulaient label préféré de la langue comme quelque chose qui est utile dans de nombreux domaines différents.
Je décrirais Ruby est un langage de script orienté objet. Oui, les fonctions sont des objets de première classe (en quelque sorte), mais qui n'a pas vraiment d'en faire un langage fonctionnel. IMO, je pourrais ajouter.
La récursivité est commun dans la programmation fonctionnelle. Presque n'importe quelle langue prend en charge la récursivité, mais d'algorithmes récursifs sont souvent inefficaces si il n'y a pas de appel tail optimisation (TCO).
Langages de programmation fonctionnelle sont capables d'optimisation de la queue de la récursivité et peut exécuter du code de la constante de l'espace. Ruby implémentations d'optimiser la queue de la récursivité, les autres ne le font pas, mais en général Ruby implémentations ne sont pas tenus de faire de coût total de possession. Voir Ne Rubis effectuer Queue Appel d'Optimisation?
Ainsi, si vous écrivez Ruby style fonctionnel et s'appuient sur le coût total de possession de certains de la mise en œuvre, votre code peut être très inefficace dans un autre interpréteur Ruby. Je pense que c'est pourquoi Ruby n'est pas un langage fonctionnel (ni Python).
À proprement parler, il ne fait pas de sens pour décrire une langue comme "fonctionnel"; la plupart des langues sont capables de la programmation fonctionnelle. Même le C++ est.
Style fonctionnel est plus ou moins un sous-ensemble de langage impératif fonctionnalités, pris en charge avec le sucre syntaxique et quelques optimisations du compilateur comme l'immuabilité et la queue de la récursivité de l'aplatissement,
Cette dernière peut dire que c'est un mineur de mise en œuvre spécifique de la technicité et n'a rien à voir avec la langue. Le x64 C# 4.0 compilateur ne tail-recursion d'optimisation, alors que le x86 on n'a pas pour quelle raison stupide.
Sucre syntaxique peut généralement être travaillé autour d'une façon ou d'une autre, surtout si la langue programmable pré-compilateur (c'est à dire C #define).
Il pourrait être un peu plus important de se demander, "est-ce de la langue __ soutien à la programmation impérative?", et la réponse, par exemple avec Lisp, est "non".
S'il vous plaît, jetez un oeil au début du livre: "Un-Grand-Ruby-eBook". Il aborde le sujet très spécifique que vous vous posez. Vous pouvez faire différents types de programmation en Ruby. Si vous souhaitez programmer comme fonctionnellement, vous pouvez le faire. Si vous souhaitez programmer comme impérative, vous pouvez le faire. C'est une définition de la question de la façon fonctionnelle Ruby dans la end est. S'il vous plaît, voir la réponse de l'utilisateur camflan.