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

Википедия говорит, что Ruby - функциональный язык, но я не уверен. Почему или почему нет?

Ответ 1

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

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

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

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

Это мое ненаучное мнение в любом случае.

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

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

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

Ответ 5

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

Ответ 6

Ruby должен соответствовать следующим требованиям, чтобы быть функциональным "TRUELY".

Неизменяемые значения:, когда установлена ​​ "переменная", ее нельзя изменить. В Ruby это означает, что вам необходимо обрабатывать переменные, такие как константы. Не поддерживается полностью на языке, вам придется заморозить каждую переменную вручную.

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

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

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

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

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

Предложение (просто мысль) Мне было бы хорошо иметь какое-то определение, чтобы иметь директиву mode для объявления файлов с функциональной парадигмой, пример

режим "функциональный"

Ответ 7

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

Пример:

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

Считайте здесь или здесь

Ответ 8

Это зависит от вашего определения "функционального языка". Лично я считаю, что сам термин весьма проблематичен при использовании в качестве абсолютного. Есть больше аспектов как "функциональный язык", чем простые языковые функции, и большинство зависит от того, от чего вы смотрите. Например, культура, окружающая язык, в этом отношении весьма важна. Поддерживает ли он функциональный стиль? Как насчет доступных библиотек? Способствуют ли они использованию их функциональным способом?

Большинство людей могли бы назвать Scheme функциональным языком, например. Но как насчет Common Lisp? Помимо проблемы с множественным/единственным пространством имен и гарантированного устранения хвостового вызова (что также поддерживается некоторыми реализациями CL, в зависимости от настроек компилятора), не так много, что делает Scheme как язык, более подходящий для функционального программирования, чем Common Lisp, и все же большинство Lispерсов не будут называть CL функциональным языком. Зачем? Поскольку окружающая его культура сильно зависит от императивных функций CL (например, макросов LOOP, которые большинство Schemers, вероятно, будут недовольны).

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

Ответ 9

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

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

Ответ 10

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

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

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

Ответ 11

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

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

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

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

Возможно, было бы несколько более интересно спросить: "поддерживает ли язык __ обязательное программирование?", а ответ, например, с Lisp, "нет".

Ответ 12

Пожалуйста, взгляните на начало книги: "A-Great-Ruby-eBook" . В нем обсуждается конкретная тема, которую вы задаете. Вы можете выполнять различные типы программирования в Ruby. Если вы хотите программировать как функционально, вы можете это сделать. Если вы хотите запрограммировать как императивно, вы можете это сделать. Вопрос о том, как функциональный Ruby, в конце концов, является вопросом определения. Пожалуйста, см. Ответ пользователя camflan.