Если люди с Java переходят на Scala, C # - на F #, то куда люди с Ruby идут за функциональной нирваной?[закрыто]

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

Вопрос

Я знаю, что многие Java-специалисты начали присматриваться к Scala, поскольку она работает на JVM, и многие люди в мире Microsoft присматриваются к F #, но что есть у Ruby в качестве естественного функционального преемника?

В чистом смысле FP Ruby ни в чем не испытывает недостатка, напротив, некоторые могут сказать, что в нем слишком много.Функциональный язык вынуждает программиста не использовать глобальные переменные и другие идиомы так часто (хотя в функциональных языках возможно использование глобальных переменных).

Это было полезно?

Решение

Их там двое очень различные определения того, что означает "функциональное программирование".Вы можете вроде как сделать одно в Ruby, но вы не можете сделать другое.

Этими двумя определениями являются:

  • программирование с использованием первоклассных функций и
  • программирование с помощью математических функций

Вы можете что-то вроде программы с первоклассными функциями на Ruby.Он имеет поддержку первоклассных функций.На самом деле, это имеет слишком много поддержка для них:есть Proc.new, proc, lambda, Method, UnboundMethod, блоки, #to_proc и ->() (и, вероятно, некоторые другие, которые я забыл).

Все это ведите себя немного по-другому, имеют немного другой синтаксис, немного другое поведение и немного другие ограничения.Например:единственный из них, который является достаточно синтаксически легким, чтобы вы действительно могли использовать его плотно, - это блоки.Но блоки имеют некоторые довольно жесткие ограничения:вы можете передать методу только один блок, блоки не являются объектами (что в объектно-ориентированном языке, в котором "все является объектом" является очень серьезное ограничение) и, по крайней мере, в Ruby 1.8 также есть некоторые ограничения по параметрам r.t.

Ссылка на метод - это еще одна вещь, которая довольно неудобна.В Питон или ECMAScript например, я могу просто сказать baz = foo.bar чтобы обратиться к bar способ проведения foo объект.В Ruby, foo.bar это метод звонить, если я хочу сослаться на bar способ получения foo, Я должен сказать baz = foo.method(:bar).И если я сейчас захочу звонить этот метод, я не могу просто сказать baz(), Я должен сказать baz.call или baz[] или (в Ruby 1.9) baz.().

Итак, первоклассные функции в Ruby не являются в самом деле первоклассный.Они намного лучше, чем второсортные, и они достаточно хорош™, но они не являются полностью первоклассными.

Но, как правило, разработчики Ruby не оставляют Ruby только для первоклассных функций.Поддержка Ruby достаточно хороша, и любые преимущества, которые вы могли бы получить от лучшей поддержки на другом языке, обычно сводятся на нет усилиями по обучению новому языку или чем-то еще ещё то, к чему вы привыкли, от чего теперь вы должны отказаться.Например, скажем, RubyGems, или тесная интеграция с Unix, или Ruby on Rails, или синтаксис, или …

Тем не менее, второй определение FP - это когда Ruby ложится плашмя на свою грань.Если вы хотите заниматься программированием с использованием математических функций на Ruby, вас ждет мир боли.Вы не можете использовать абсолютное большинство библиотек Ruby, потому что большинство из них отслеживают состояние, эффективны, способствуют мутации или иным образом загрязнены.Вы не можете использовать стандартную библиотеку по тем же причинам.Вы не можете использовать основную библиотеку.Вы не можете использовать ни один из основных типов данных, потому что все они изменяемы.Вы могли бы просто сказать "Мне все равно, что они изменчивы, я просто не буду их изменять и всегда буду копировать", но проблема в том, что:кто-то еще все еще может их мутировать.Кроме того, поскольку они изменяемы, Ruby не может оптимизировать копирование, а сборщик мусора не настроен на такую нагрузку.

Это просто не работает.

Существует также пара функций, которые на самом деле не имеют ничего общего с функциональным программированием, но которые, как правило, есть в большинстве функциональных языков, и которых нет в Ruby.Сопоставление с образцом, например.Раньше достичь лени тоже было не так-то просто Enumerators были более агрессивно использованы в Ruby 1.9.И есть еще кое-что, что работает со строгими Enumerableы или Arrayс, но не с ленивым Enumerators, хотя на самом деле у них нет никаких причин для этого требовать строгость.

И для это определение FP, безусловно, имеет смысл оставить Ruby позади.

Двумя основными языками, к которым стекаются любители рубинов, являются Эрланг и Clojure ( Клоджур ).Оба они относительно хорошо подходят для Ruby, потому что оба динамически типизированы, имеют схожую с Ruby культуру REPL и (это больше относится к Rails, чем к Ruby) также очень хороши в Интернете.У них по-прежнему довольно маленькие и гостеприимные сообщества, создатели оригинальных языков по-прежнему активны в сообществе, они сосредоточены на создании новых, захватывающих и острых вещей, и все это является чертами, присущими и сообществу Ruby.

Интерес к Erlang возник, когда кто-то показал оригинальное ознакомительное видео 1993 года "Эрланг:Фильм" на RubyConf 2006.Например, пара громких проектов Rails начали использовать Erlang Набор мощности и ГитХаб.Эрлангом также легко овладеть рубинистам, потому что он не требует такой чистоты, как Хаскелл или Чистый.Тот Самый внутри роль актера довольно чиста, но сам акт отправки сообщений, конечно, является побочным эффектом.Еще одна вещь, которая облегчает понимание Erlang, - это то, что Действующие лица и Объекты на самом деле являются одним и тем же, когда вы следуете Определение объектно-ориентированного программирования Алана Кея.

Clojure стал недавним дополнением к набору инструментов Rubyist'а.Я думаю, что его популярность в основном обусловлена тем фактом, что сообщество Ruby наконец-то прониклось идеей, что JVM - это Java, и приняло Руби и тогда они начали осматриваться , что Другое интересные вещи были в JVM.И опять же, Clojure гораздо более прагматичен, чем оба других функциональных языка, таких как Haskell и другие Lisps, такие как Схема и гораздо проще и современнее, чем CommonLisp, поэтому он идеально подходит для любителей рубинов.

Еще одна интересная особенность Clojure заключается в том, что, поскольку и Clojure, и Ruby работают на JVM, вы можете комбинировать они.

Автор книги "Программирование Clojure" (Стюарт Хэллоуэй) является (бывшим?) Рубистом, например, как Фил Хагельберг, автор книги " Leiningen инструмент сборки для Clojure.

Однако рубинисты также рассматривают и то, и другое Скала (как один из более прагматичных статически типизированных языков FP) и Haskell (как один из более элегантных).Кроме того, есть такие проекты, как Скуби и Высокомерие это мосты, которые позволяют интегрировать Ruby со Scala и Haskell соответственно.Решение Twitter перенести часть своей низкоуровневой инфраструктуры обмена сообщениями сначала с MySQL на Ruby, а затем с Ruby на Scala также довольно широко известно.

F# похоже, это вообще не играет никакой роли, возможно, из-за иррационального страха перед всем, что есть в сообществе Microsoft и Ruby.(Что, кстати, кажется в основном необоснованным, учитывая, что команда F # имеет всегда сделал версии доступными для Mono.)

Другие советы

Люди, использующие Java, используют язык в JVM и хотят более функциональный, совместимый с их средой выполнения, поэтому они переходят на Scala.

Люди, работающие с C#, используют язык в CLR и хотят иметь более функциональный язык, совместимый с их средой выполнения, поэтому они переходят на F#.

Люди, работающие с Ruby, используют язык, который уже достаточно функционален, и они используют его в ряде базовых сред выполнения (JRuby, IronRuby, MRI, MacRuby, Rubinius и т. д.).Я не думаю, что у него есть естественный функциональный преемник или он даже не нужен.

Любая версия Лиспа подойдет.

Ruby сам по себе является своего рода функциональным языком программирования, поэтому я не вижу каких-либо специальных диалектов для FP, использующих Ruby.

На уровне хайпа, Haskell.

Если предположить, что люди, использующие Ruby, не просто используют JVM, я думаю, что большинство из них примут Erlang, еще один динамически типизированный язык.

Ruby не так функционален, как, скажем, Lisp, но он достаточно функционален, чтобы вы могли весело заниматься функциональным программированием.(в отличие от попыток функционального программирования на чем-то вроде C#)

Кроме того, он фактически вынуждает вас использовать функциональные парадигмы в некоторых синтаксисах, таких как интенсивное использование блоков и выходных данных.(в который я влюбился после изучения Ruby).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top