Может ли Ruby действительно использоваться как функциональный язык? - PullRequest
10 голосов
/ 17 октября 2008

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

Ответы [ 6 ]

12 голосов
/ 17 октября 2008

Да ... вроде. В 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). Я не уверен, почему это тенденция в функциональных языках, но у вас это есть.

4 голосов
/ 17 октября 2008

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

2 голосов
/ 17 октября 2008

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

0 голосов
/ 18 октября 2008

Вы также довольно быстро столкнетесь с проблемами, если будете использовать какой-либо рекурсивный алгоритм. 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

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

0 голосов
/ 17 октября 2008

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

0 голосов
/ 17 октября 2008

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

Ruby вполне способен вписаться в различные «программные формы», но, безусловно, он не оптимален для большинства из них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...