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

Может ли Ruby действительно использоваться как функциональный язык? Каковы некоторые хорошие учебные пособия для обучения этому аспекту языка? Примечание. Я действительно хочу использовать и придерживаться Ruby в качестве основного языка, поэтому мне неинтересно, что мы переводим его в YAFL (еще один функциональный язык). Я действительно заинтересован в том, насколько хорошо функциональные грани Ruby работают со стандартным базовым уровнем функционального языка. Спасибо.

Ответ 1

Да... вроде. Ruby не имеет разумной конструкции для обеспечения неизменности. (Object#freeze не учитывается) Неизменность - это действительно краеугольный камень функциональных языков. Кроме того, основные библиотеки Ruby очень ориентированы на императивный дизайн. Его классы Array и Hash оба изменяются по своей природе, даже String имеет методы, которые делают неизменяемым (например, gsub!). По иронии судьбы, Java в этом отношении более функциональна, чем Ruby.

С учетом сказанного можно сделать функционально-подобное программирование в Ruby. Каждый раз, когда вы используете блок /proc/lambda, вы используете функцию, которая исходит из функционального программирования. Подобным образом, методы сбора данных, такие как map и zip, также являются конструкциями более высокого порядка, которые находят свои корни в таких языках, как Lisp, ML и Haskell.

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

  • Clojure - Поскольку вы сформулировали вопрос с помощью Ruby, я предполагаю, что вы динамически типизированное убеждение. Clojure похож на строго функциональный Lisp, который работает на JVM.
  • F # - В основном OCaml на CLR. Очень приятно, очень чисто.
  • Scala - не строго функциональный язык, но гораздо лучше для него, чем Ruby
  • Haskell - Все любят!

Вы заметите, что три из этих четырех языков статически типизированы. На самом деле, в случае Scala и Haskell, это очень статически типизированные языки (гораздо более сильные системы типов, чем, скажем, Java). Я не уверен, почему это тенденция в функциональных языках, но там у вас есть.

Ответ 2

Это зависит от того, что вы подразумеваете под "Функциональным программированием". На мой взгляд, самое главное, что функции значения первого класса, и в этом отношении Ruby является функциональным языком.

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

def foo(n)
  puts n
  foo(n + 1)
end

foo(1)

Дает вам

SystemStackError: stack level too deep
    from (irb):2:in `puts'
    from (irb):2:in `foo'
    from (irb):3:in `foo'
    from (irb):5

После нескольких тысяч итераций (в зависимости от вашей системы)

Ответ 6

Взгляните на Haskell. Это функциональный язык, который синтаксически очень похож на Ruby.