Étant donné que Ruby a une bonne liste des capacités de fonctionnement en construction - réduire, carte, sélectionnez, recueillez etc. Il a procs, blocs et lambdas, et a beau support d'itération (la each
famille), serait - il une mauvaise décision de conception si je tente de écrire tous mes trucs Ruby de la manière la plus fonctionnelle possible? Surtout pour le code qui a peu ou pas d'E / S (donc des effets secondaires moins évidents)?
J'ai appris le Haskell (appelé le `` vrai '' langage de Hacker), et je suis amoureux de sa façon de faire les choses - j'aime Ruby, mais je pense que cela peut être encore plus amusant quand plus d'esprit Haskell y pénètre (enfin, didn 't Ruby emprunter / apprendre beaucoup de lui en premier lieu?)
Une orientation constructive est la bienvenue ...
la source
Réponses:
Je fais ça avec python. Je trouve qu'il est lourd d'écrire dans un style fonctionnel héréditaire pur dans un langage qui n'a pas été conçu pour cela. Par exemple, contrastez les deux définitions de in_order :
L'écriture de
in_order
la manière Haskell en python va être à la fois verbeuse (puisque python ne supporte pas très bien les idiomes nécessaires) et lente (espace linéaire au lieu de l'espace constant de Haskell en raison de la paresse).Cependant, j'ai réussi à créer des programmes python avec une organisation fonctionnelle et une implémentation idiomatique de chaque fonction. L'idée que c'est une bonne façon de programmer est en fait la thèse derrière mon projet de codecatalog . Donc, mes composants sont orientés autour d'abstractions et de fonctions (avec une interface pure ) qui opèrent sur eux, plutôt que de classes avec état, et ça se marie bien. En fait, le code organisé de cette façon semble être plus flexible à réutiliser que le code organisé avec des classes. Cela pourrait toutefois être un parti pris personnel, car je suis toujours un passionné de Haskell.
Je dirais donc que la réponse à votre question est un peu . Utilisez vos racines fonctionnelles pour vous aider à réfléchir, mais n'en faites pas trop. Par exemple. simuler des listes paresseuses dans Ruby juste pour le bien de l'idiome va probablement être plus difficile que cela en vaut la peine.
la source
and
consommées; il se comportera comme une boucle. Alors que la liste des comparaisons de python devra être générée en entier avant que l'analogue deand
ne les voit (sauf si vous utilisez des générateurs ... ce qui, je suppose, est une possibilité).Vous pouvez écrire du code Ruby dans un style fonctionnel comme s'il s'agissait de Scheme, pas de Haskell. Pour l'écrire comme s'il s'agissait de Haskell, il faudrait un système de type Haskell, plus une évaluation paresseuse omniprésente.
la source
J'ai trouvé que la compréhension de la programmation fonctionnelle, et Haskell en particulier, m'aidait dans certaines situations que j'ai rencontrées dans Ruby. Mais plus j'apprends Haskell, plus je réalise à quel point Ruby est loin de pouvoir ressembler à Haskell.
La situation de chargement de module / code est catastrophique, pour une chose. L'interpréteur actuel n'a pas l'optimisation des appels de queue activée, vous ne pouvez donc pas utiliser la récursion comme vous le faites dans Haskell. Et une fois que vous entrez dans Monads, il n'y a vraiment aucune comparaison des niveaux d'abstraction que vous pouvez atteindre dans Haskell vs Ruby.
Si vous êtes intéressé, j'ai publié un code de comparaison Ruby / Haskell sur gist.github.com pendant que j'apprends.
La technique que j'ai apportée à Ruby qui a fonctionné le mieux a été de trouver des fonctions pures où je peux, c'est ce que vous essayez de faire.
la source
self assert: ((m >>= f) >>= g) equals: (m >>= [:x | (f value: x) >>= g])
. Il n'y a aucune raison pour laquelle vous ne pouvez pas utiliser consciemment des monades, au lieu de les utiliser sans même savoir que vous les utilisez (comme des listes).Je dirais "oui". Vous parlez (je pense) de l' influence de la programmation fonctionnelle dans le langage rubis. Le paradigme fonctionnel a de très beaux concepts qui complètent ou se chevauchent avec orienté objet (pas d'effets secondaires, en particulier).
La grande chose à propos de ruby est qu'il vous permet de coder dans un style linéaire, orienté objet ou fonctionnel, ou un mélange de ceux-ci. Et votre script simple et linéaire peut se transformer en style OO / fonctionnel si et quand sa complexité augmente.
la source
Cela dépend si vous allez collaborer avec d'autres. Si vous travaillez vous-même sur le code, utilisez le style avec lequel vous vous sentez le plus à l'aise. Cependant, si vous travaillez avec d'autres programmeurs Ruby, ils ne peuvent pas être utilisés pour un style de programmation purement fonctionnel et donc être confondus par votre code. Là encore, si vos collaborateurs sont également des programmeurs Haskell qui ont migré vers Ruby, vous pouvez ne pas avoir ce problème.
la source