..


Рекламные ссылки

Функциональное программирование в Рубине

Статья написана Алессио Saltarini
Страница 1 из 2

Введение

Функциональное программирование (FP) является альтернативной парадигмы программирования, чтобы традиционные (структурные или императивного программирования и объектно-ориентированное программирование) придумали, как "лямбда-исчисления" от Алонсо церкви в 30 лет, задолго до того, стало известно, что точно, что это был компьютер.

Исследования церкви послужили основой для развития языка программирования Lisp, а затем они были практически полностью отказались, так как они утверждали, императивного программирования компьютеров, создавшего Базовые и, как Pascal, C, и сегодня современный C + + и Java.

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

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

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

Интерес к функциональным языкам было потеряно в течение долгого времени по нескольким причинам, в первую очередь трудности обучения (как правило, человек думает, объектов, а не функции, если только он не математик!) И трудности в поиске эффективное переводчиков или компиляторов.

Руби и FP

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

Так родились и некоторые из них процветают функциональных языков (более или менее чистый, а с более или менее поддержка традиционного программирования), таких как: ML / OCaml , Haskell , F # .

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

Каждый и карты

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






 Элементы $ = [1,2,3,4,5]







 Elementi.map $ {| элем | ставит элем} + 1



Функции "карта" и "каждый" Руби являются не более чем применять FP! На самом деле Есть функции, которые имеют другие функции в качестве аргументов. В Ruby, то, что те части блоков кода, заключенные в {} или между делать / конец анонимные функции созданы специально, чтобы быть тем из многих функций.

Эти функции вызываются в FP высокого порядка функций, т.е. функций, которые принимают как многие функции в качестве входных данных.

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

Это "карта" или "партнеры", для каждого элемента коллекции (массива в Рубине мы бы сказали) определенные функции, определенной в блоке.

То же самое произойдет, естественно, с:

 



 $ Elementi.each {...}

 
Замыкания: Труды и лямбда-

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

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

Вот пример:






 Def умножить (множитель)



    



 возвращение лямбда {| п | п * множитель}







 конец









 per3 = умножения (3)









 per3.call ставит (3) # => 9







 ставит per3.call (per8.call (2)) # => 48



Не совсем очевидно в этом примере я определяю функцию "размножаться". Что же такого странного эту функцию? Здесь я просто не использовать любую переменную!

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

Но, в традиционном программировании, я бы написать:






 Def умножить (б)



    



 возвращение * б







 конец









 ставит умножение (3.3)



Как можно видеть, однако, я определяю закрытия использовании "оператор" Я называю per3, который определяет поведение всех умножения "x3". Затем я называю этот оператор № 3. Я также могу называть его рекурсивно! Или называть, а не постоянно, на другую функцию.

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

В той же категории ...
E-Learning
Руби и Ruby On Rails (курс) Руби и Ruby On Rails (курс)
Создание программного обеспечения и веб-приложений с Рубином и RoR. С 39 €.
Рекламные ссылки