Действительно ли Ruby является функциональным языком?

Этот ответ должен быть довольно коротким и сладким, чтобы ответить (часть) озаглавленного вопроса. Если вы хотите получить более подробный ответ, объясняющий, почему вы должны их там поместить, пожалуйста, перейдите здесь .


Общее правило для размещения typename в основном, когда вы используете параметр шаблона, и хотите получить доступ к вложенному typedef или с использованием псевдонима, например:

template
struct test {
    using type = T; // no typename required
    using underlying_type = typename T::type // typename required
};

Обратите внимание, что это также относится к метафункциям или вещи, которые также принимают общие параметры шаблона. Однако, если предоставленный параметр шаблона является явным типом, вам не нужно указывать typename, например:

template
struct test {
    // typename required
    using type = typename std::conditional::type;
    // no typename required
    using integer = std::conditional::type;
};

Общие правила добавления определителя template в основном аналогичны, за исключением они обычно включают шаблонные функции-члены (статические или другие) структуры / класса, которые сами шаблоны, например:

Учитывая эту структуру и функцию:

template
struct test {
    template
    void get() const {
        std::cout << "get\n";
    }
};

template
void func(const test& t) {
    t.get(); // error
}

Попытка доступа t.get() изнутри функции приведет к ошибке:

main.cpp:13:11: error: expected primary-expression before 'int'
     t.get();
           ^
main.cpp:13:11: error: expected ';' before 'int'

Таким образом, в этом контексте вам понадобится ключевое слово template заранее и вызвать его так:

t.template get()

Таким образом, компилятор будет анализировать это правильно, а не t.get < int.

85
задан Peter Mortensen 28 August 2015 в 17:42
поделиться

11 ответов

Я совершенно определенно думаю, что можно использовать функциональный стиль в Ruby.

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

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

Так, да, это поддерживает функциональный стиль, но это также позволит Вам программа в нефункциональном стиле также.

29
ответ дан Mike Stone 24 November 2019 в 08:17
поделиться

Ruby действительно поддерживает высокоуровневые функции (см. Array#map, введите, & выберите), но это - все еще императив, Объектно-ориентированный язык.

Одна из ключевых характеристик функционального языка это, что это избегает изменяемого состояния. Функциональные языки не имеют понятия переменной, как Вы имели бы в Ruby, C, Java или любом другом императивном языке.

Другая ключевая характеристика функционального языка - то, что он фокусируется на определении программы с точки зрения "какой", а не "как". При программировании на языке OO мы пишем классы & методы для сокрытия реализации ("как") от, "что" (класс/имя метода), но в конце эти методы все еще записаны с помощью последовательности операторов. На функциональном языке Вы не определяете последовательность выполнения, даже на самом низком уровне.

34
ответ дан Mike 24 November 2019 в 08:17
поделиться

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

я могу даже записать код Java в функциональном стиле, если я хочу причинить боль своим коллегам и мне несколько <забастовка> месяцы недели на.

Наличие функционального языка не только, о каком Вы можете , делают, такие как функции высшего порядка, первоклассные функции и приправление карри. Это также о том, что Вы не можете делать, как побочные эффекты в чистых функциях.

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

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

Это - мое ненаучное мнение так или иначе.

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

реальный дифференциатор является дифференциатором того, чтобы быть обязательным в выполнении, или нет. Функциональные языки имеют выражение как свою основную лингвистическую конструкцию, и порядок выполнения часто не определен или определяется как являющийся ленивым. Строгое выполнение возможно, но только используемое при необходимости. На обязательном языке строгое выполнение является значением по умолчанию и в то время как ленивое выполнение возможно, это часто топорно, чтобы сделать и может иметь непредсказуемые результаты во многих пограничных случаях.

Теперь, это мое ненаучное мнение.

15
ответ дан Chris Vest 24 November 2019 в 08:17
поделиться

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

9
ответ дан skymt 24 November 2019 в 08:17
поделиться

Ruby является объектно-ориентированным языком, который может поддерживать другие парадигмы (функциональный, обязательный, и т.д.). Однако, так как все в Ruby - объект, это - прежде всего, язык OO.

пример:

"привет" .reverse () = "olleh", каждая строка является строковым экземпляром объекта и т. д. и т. п.

Read здесь или здесь

4
ответ дан camflan 24 November 2019 в 08:17
поделиться

Это зависит от Вашего определения “functional language”. Лично, я думаю, что термин самостоятельно довольно проблематичен, когда используется в качестве абсолюта. Большего количества аспектов к тому, чтобы быть “functional language”, чем простые функции языка и большинство зависит от того, откуда Вы смотрите. Например, культура, окружающая язык, довольно важна в этом отношении. Это поощряет функциональный стиль? Что относительно доступных библиотек? Они поощряют Вас использовать их функциональным способом?

Большинство людей назвало бы Схему функциональным языком, например. Но что относительно языка Common LISP? Кроме проблемы multiple-/single-namespace и гарантируемое устранение последнего вызова (который некоторые реализации CL поддержка также, в зависимости от параметров компилятора), нет очень, который делает Схему как язык больше подходящее для функционального программирования, чем язык Common LISP, и тем не менее, большая часть Lispers не назвала бы CL функциональным языком. Почему? Поскольку культура, окружающая его в большой степени, зависит от обязательных функций CL (как макрос ЦИКЛА, например, который большинство Интриганов, вероятно, осудило бы).

, С другой стороны, программист C может считать CL функциональным языком. Большая часть кода, записанного на любом диалекте Lisp, конечно, намного более функциональна в стиле, чем Ваш обычный блок кода C, в конце концов. Аналогично, Схема является в значительной степени императивным языком по сравнению с Haskell. Поэтому я не думаю, что может когда-либо быть определенный ответ "да"/"нет". Назвать ли язык функциональным или не в большой степени зависит от Вашей точки зрения.

4
ответ дан Matthias Benkard 24 November 2019 в 08:17
поделиться

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

я описал бы Ruby, объектно-ориентированный язык сценариев. Да, функции являются первоклассными объектами (вид), но это действительно не делает его функциональным языком. IMO, я мог бы добавить.

2
ответ дан JesperE 24 November 2019 в 08:17
поделиться

Please, have a look at the beginning of the book: "A-Great-Ruby-eBook". It discusses the very specific topic you are asking. You can do different types of programming in Ruby. If you want to program like functionally, you can do it. If you want to program like imperatively, you can do it. It is a definition question how functional Ruby in the end is. Please, see the reply by the user camflan.

1
ответ дан 24 November 2019 в 08:17
поделиться

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

Функциональные языки программирования способны оптимизировать хвостовую рекурсию и могут выполнять такой код в постоянном пространстве . Некоторые реализации Ruby оптимизируют хвостовую рекурсию, другие - нет, но в целом реализации Ruby не требуют TCO. См. Выполняет ли Ruby оптимизацию хвостового вызова?

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

2
ответ дан 24 November 2019 в 08:17
поделиться

Неважно, является ли язык функциональным или нет. Функциональное программирование - это тезис, лучше всего объясненный Филипом Уодлером (Суть функционального программирования) и Джоном Хьюзом (Почему функциональное программирование имеет значение).

Значимый вопрос: «Насколько Ruby поддается реализации тезиса функционального программирования?» Ответ - «очень плохо».

Я недавно говорил об этом. Вот слайды.

58
ответ дан 24 November 2019 в 08:17
поделиться

Строго говоря, нет смысла называть язык «функциональным»; большинство языков способны к функциональному программированию. Даже C ++ есть.

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

Последнее, возможно, является незначительной технической особенностью конкретной реализации и не имеет никакого отношения с актуальным языком. Компилятор x64 C # 4.0 оптимизирует хвостовую рекурсию, тогда как компилятор x86 не делает этого по какой-то глупой причине.

Синтаксический сахар обычно можно в той или иной степени обойти, особенно если в языке есть программируемый прекомпилятор (например, #define в языке C).

Было бы немного более осмысленным спросить: «Поддерживает ли язык __ императивное программирование?», И ответ, например, с Lisp, будет «нет».

2
ответ дан 24 November 2019 в 08:17
поделиться
Другие вопросы по тегам:

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