Si Java gens vont à Scala, C # aller à F #, où les gens vont pour Ruby nirvana fonctionnelle? [fermé]

StackOverflow https://stackoverflow.com/questions/2254368

Question

Je sais que beaucoup de gens Java ont commencé à regarder Scala car il fonctionne sur la machine virtuelle Java, et beaucoup de gens dans le monde Microsoft sont à la recherche à F #, mais qu'est-ce que Ruby a comme successeur fonctionnel naturel?

Dans un sens le plus pur FP Ruby ne manque de rien, à la place, il a trop certains peuvent dire. Un langage fonctionnel oblige le programmeur à ne pas utiliser les variables globales et d'autres idiomes tellement (bien qu'il soit possible d'utiliser dans les langages fonctionnels GLOBALS)

Était-ce utile?

La solution

Il y a deux très des définitions différentes de ce que signifie « programmation fonctionnelle ». Vous pouvez faire de type de celui de Ruby, mais vous ne pouvez pas l'autre.

Ces deux définitions sont:

  • programmation avec des fonctions de première classe et
  • Programmation avec des fonctions mathématiques

Vous pouvez de type de programme avec des fonctions de première classe en Ruby. Il supporte les fonctions de première classe. En fait, il a trop soutien pour eux. Il y a Proc.new, proc, lambda, Method, UnboundMethod, blocs, #to_proc et ->() (et probablement d'autres que j'oublie)

Tous ces se comportent un peu différemment , ont une syntaxe légèrement différente, comportement légèrement différent et les restrictions légèrement différentes. Par exemple: le seul d'entre eux qui est syntaxiquement assez léger que vous pouvez réellement utiliser à forte densité, est blocs. Mais les blocs ont des restrictions assez sévères: vous ne pouvez passer un bloc à une méthode, les blocs ne sont pas des objets (qui, dans un langage orienté objet dans Wich « tout est un objet » est un très sévère restriction) et au moins dans Ruby 1.8 il y a aussi des restrictions paramètres wrt.

En se référant à une méthode est une autre chose qui est assez gênant. Python ou ECMAScript par exemple, je peux juste dire baz = foo.bar de se référer à la méthode bar de l'objet foo. Dans Ruby, foo.bar est une méthode appel , si je veux me référer à la méthode bar de foo, je dois dire baz = foo.method(:bar). Et si je veux maintenant appel cette méthode, je ne peux pas dire que baz(), je dois dire baz.call ou baz[] ou (en Ruby 1.9) baz.().

Ainsi, les fonctions de première classe en Ruby ne sont pas vraiment de première classe. Ils sont beaucoup mieux que la deuxième classe, et ils sont assez bon ™, mais ils ne sont pas tout à fait de première classe.

Mais en général, Rubyistes ne laisse pas Ruby juste pour les fonctions de première classe. Le soutien de Ruby est assez bon que tous les avantages que vous pourriez gagner d'un meilleur soutien dans une autre langue est généralement consommé par l'effort de formation pour la nouvelle langue ou par quelque chose autre que vous êtes habitué à ce que vous devez maintenant donner vers le haut. Comme, par exemple RubyGems ou intégration Unix serré ou Ruby on Rails ou de syntaxe ou ...

Cependant, secondes définition de FP est où Ruby tombe à plat sur son visage. Si vous voulez faire la programmation avec des fonctions mathématiques en Ruby, vous êtes dans un monde de douleur. Vous ne pouvez pas utiliser la majorité absolue des bibliothèques Ruby, parce que la plupart d'entre eux sont stateful, effectful, encourager la mutation ou sont autrement impur. Vous ne pouvez pas utiliser la bibliothèque standard pour les mêmes raisons. Vous ne pouvez pas utiliser la bibliothèque de base. Vous ne pouvez pas utiliser l'un des types de données de base, car ils sont tous mutable. Vous pourriez dire: « Je ne me soucie pas qu'ils sont mutable, je tout simplement pas les muter et toujours les copier », mais le problème est: quelqu'un d'autre peut encore les muter. De plus, parce qu'ils sont mutable, Ruby ne peut pas optimiser la copie et le garbage collector est pas accordé pour ce genre de travail.

Il ne fonctionne tout simplement pas.

Il y a aussi quelques fonctionnalités qui ont vraiment rien à voir avec la programmation fonctionnelle, mais que les langues les plus fonctionnels ont tendance à avoir, que Ruby manque. La correspondance de motifs, par exemple. Paresse aussi était pas facile à réaliser avant Enumerators ont été plus agressivement utilisés dans Ruby 1.9. Et il y a encore des choses qui fonctionne avec Enumerables strictes ou Arrays mais pas avec Enumerators paresseux, bien qu'il y ait »est en fait aucune raison pour eux de besoin rigueur.

Et pour cette définition de FP , il est certainement judicieux de laisser Ruby derrière.

Les deux langues principales Rubyistes ont afflué à, sont Erlang et Clojure . Ce sont les deux relativement bons résultats pour Ruby, parce qu'ils sont à la fois typés dynamiquement, ont une même culture REPL comme Ruby, et (ce qui est plus une chose Rails qu'une chose Ruby) sont également très bon sur le web. Ils ont encore assez petites et les collectivités accueillantes, les créateurs de langue d'origine sont toujours actifs dans la communauté, il y a un fort accent sur faire des choses nouvelles, passionnantes et avant-gardistes, qui sont tous les traits que la communauté Ruby a aussi.

L'intérêt Erlang a commencé, quand quelqu'un a montré l'original 1993 l'introduction vidéo « Erlang: film "à RubyConf 2006. quelques Rails Divers projets ont commencé à utiliser Erlang, par exemple PowerSet et GitHub . Erlang est également facile à maîtriser pour Rubyistes, car il ne prend pas la pureté tout à fait aussi loin que Haskell ou Clean . dans d'un acteur est assez pur, mais l'acte d'envoyer des messages lui-même est bien sûr un effet secondaire. Une autre chose qui rend Erlang facile à comprendre, est que les acteurs et les objets sont en fait la même chose, lorsque vous suivez la définition d'Alan Kay de la programmation orientée objet .

Clojure est un ajout récent à la toolbelt du Rubyist. Sa popularité est je suppose que la plupart du temps motivée par le fait que la communauté Ruby a finalement réchauffé à l'idée que JVM Java et ≠ embrassé JRuby puis ils ont commencé à regarder autour de ce que autre choses intéressantes il y avait sur la machine virtuelle Java. Et encore, Clojure est beaucoup plus pragmatique que les deux autres langages fonctionnels comme Haskell et d'autres Lisps comme Scheme et beaucoup plus simple et plus moderne que CommonLisp, il est donc tout naturel pour rubyistes.

Une autre chose cool Clojure est que parce que les deux Clojure et Ruby fonctionnent sur la machine virtuelle Java, vous pouvez combiner les.

L'auteur de " Programmation Clojure " (Stuart Halloway) est un (ancien ?) Rubyist, par exemple, est Phil Hagelberg , l'auteur du Leiningen outil pour construire Clojure.

Cependant, Rubyistes cherchent également à la fois Scala (comme l'un des plus pragmatiques langues FP typés statiquement) et Haskell (comme une des plus élégantes). Ensuite, il y a des projets comme Scuby et hubris qui sont des ponts qui vous permettent d'intégrer Ruby avec Scala et Haskell, respectivement. La décision de Twitter pour déplacer une partie de leur infrastructure de messagerie à faible niveau d'abord de MySQL à Ruby, puis de Ruby à Scala est aussi assez largement connue.

F # ne semble pas jouer un rôle quelconque, peut-être en raison d'une peur irrationnelle envers toutes choses Microsoft la communauté Ruby a. (Ce qui, d'ailleurs, semble la plupart du temps sans fondement, étant donné que l'équipe F # a toujours de versions disponibles pour Mono.)

Autres conseils

Java gens utilisent une langue sur la machine virtuelle Java et que vous voulez un plus fonctionnel qui soit compatible avec leur exécution, ils vont à Scala.

C # personnes utilisent une langue sur le CLR et que vous voulez un plus fonctionnel qui soit compatible avec leur exécution, ils vont à F #.

personnes Ruby utilisent une langue qui est déjà très fonctionnel, et ils l'utilisent sur un certain nombre de sous-jacents (runtimes JRuby, IronRuby, IRM, MacRuby, Rubinius, etc ...). Je ne pense pas qu'il ait un successeur fonctionnel naturel, ou même un besoin.

Toute version de Lisp devrait être bien.

Ruby elle-même est une sorte de langage de programmation fonctionnelle, donc je ne vois pas de dialectes spéciaux pour FP en utilisant Ruby.

Dans le niveau de battage médiatique, Haskell.

En supposant que les gens Ruby ne vont pas seulement à la machine virtuelle Java eux-mêmes, je pense que la plupart adopteraient Erlang, étant une autre langage typé dynamiquement.

Ruby n'est pas aussi fonctionnel que dire Lisp, mais il est juste assez fonctionnel que vous pouvez faire de la programmation fonctionnelle dans une bonne façon amusante. (Contrairement à essayer de faire de la programmation fonctionnelle dans quelque chose comme C #)

En outre, il vous oblige réellement dans les paradigmes fonctionnels dans une partie de sa syntaxe, telles que l'utilisation intensive des blocs et le rendement. (Que je suis tombé amoureux de Ruby après avoir appris).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top