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

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

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

36
задан Yi Jiang 15 March 2011 в 05:55
поделиться

7 ответов

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

Это два определения:

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

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

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

Обращение к методу - еще одна довольно неудобная вещь.Например, в Python или 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 достаточно хороша, поэтому любые преимущества, которые вы можете получить от лучшей поддержки на другом языке, обычно съедаются усилиями по обучению новому языку или чему-то еще , к чему вы привыкли, и от чего вы должны отказаться. . Например, скажем, RubyGems или тесная интеграция с Unix, или Ruby on Rails, или синтаксис, или…

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

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

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

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

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

Интерес к Erlang начался, когда кто-то показал оригинальное вступительное видео 1993 года « Erlang: The Movie » на RubyConf 2006.Несколько известных проектов Rails начали использовать Erlang, например PowerSet и GitHub . Rubyists легко освоить Erlang, потому что он не требует такой чистоты, как Haskell или Clean . внутри актера довольно чистая, но сама отправка сообщений - это, конечно, побочный эффект. Еще одна вещь, которая упрощает понимание Erlang, заключается в том, что действующие лица и объекты на самом деле одно и то же, если следовать определению объектно-ориентированного программирования Алана Кея .

Clojure был недавним дополнением к инструментарию Rubyist. Его популярность, я полагаю, в основном обусловлена ​​тем фактом, что сообщество Ruby, наконец, согрелось к идее, что JVM ≠ Java и приняло JRuby , а затем они начали искать другие интересные вещи там были на JVM. И снова Clojure гораздо более прагматичен, чем оба других функциональных языка, таких как Haskell, и другие Lisp, такие как Scheme , и намного проще и современнее, чем CommonLisp, поэтому он естественным образом подходит для рубистов.

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

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

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

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

76
ответ дан 27 November 2019 в 05:16
поделиться

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

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

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

15
ответ дан 27 November 2019 в 05:16
поделиться

Итерация не требуется

function formatNumber(n, separator) {
    separator = separator || ",";

    n = n.toString()
        .split("").reverse().join("")
        .replace(/(\d{3})/g, "$1" + separator)
        .split("").reverse().join("");

    // Strings that have a length that is a multiple of 3 will have a leading separator
    return n[0] == separator ? n.substr(1) : n;
}

var testCases = [1, 45, 2856, 398868483992];
for ( var i in testCases ) {
    if ( !ns.hasOwnProperty(i) ) { continue; }
    console.info(testCases[i]);   
    console.log(formatNumber(testCases[i]));
}

Результаты

1
1

45
45

2856
2,856

398868483992
398,868,483,992
-121--1200183-

http://mugtug.com/sketchpad/

-121--1721967-

Любая версия Lisp должна быть в порядке.

7
ответ дан 27 November 2019 в 05:16
поделиться

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

6
ответ дан 27 November 2019 в 05:16
поделиться

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

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

3
ответ дан 27 November 2019 в 05:16
поделиться

Предполагая, что люди, работающие с Ruby, не просто переходят на JVM сами, я думаю принял бы Erlang, еще один язык с динамической типизацией.

3
ответ дан 27 November 2019 в 05:16
поделиться

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

3
ответ дан 27 November 2019 в 05:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: