..
Введение
Функциональное программирование (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.
Я также могу называть его рекурсивно!
Или называть, а не постоянно, на другую функцию.
В традиционном программировании, однако, я вынужден заранее определить число переменных, участвующих в сделке - тем самым ограничивая умножение двух чисел - и, самое главное, у меня есть, чтобы вставить концепцию государства, выделение памяти для двух переменных, содержат значения нужно умножить.
| |
Руби и Ruby On Rails (курс)
Создание программного обеспечения и веб-приложений с Рубином и RoR. С 39 €. |