Cтраница 3
Соответствующие вложенным ( nested) циклам процедурного программирования многократные повторения в функциональном программировании осуществляются обычно с помощью двух и более функций, каждая из которых соответствует простому циклу. Вызов такой рекурсивной функции используется в определении другой функции з качестве аргумента ее рекурсивного вызова. Естественно, аргументом рекурсивного вызова в определении функции может быть другой рекурсивный вызов. [31]
Рассмотрим некоторые операции на множествах, представленных списками, и сравним их с примерами функционального программирования из гл. Сначала запишем предикаты, задающие пересечение, объединение и разность первых двух аргументов. [32]
Поэтому денотационная семантика языкл точно специфицирует что является величиной любого исходного выражения в истинном духе функционального программирования, тогда как операционная семантика предписывает как выражения вычисляются и в наибольшей степени подходят для разработки интерпретатора. Однако, если в нашем распоряжении имеется существующая реализация функционального языка, денотационная семантика также может быть использована непосредственно в качестве интерпретатора, и это по существу то, что мы делали в гл. В настоящее время один из ключевых вопросов теории языков программирования заключается в том, чтобы доказать, что операционная семантика языка, основываясь на которой мы хотим строить реализации, эквивалентна его денотационной семантике, которая должна быть частью определения языка. Такие эквивалентности устанавливаются формально в виде теорем соответствия, которые по существу докатывают корректность интерпретаторов в предположении, что эти программы на самом деле приведены в соответствие с операционной семантикой. Однако эти доказательства являются длинными, и требуется еще много исследований, чтобы данный подход стал практическим методом разработки программного обеспечения. [33]
Программы с конечным числом переменных напоминали ассемблер; рассматриваемые в этом разделе рекурсивные функции скорее напоминают функциональное программирование, когда одни функции определяются через другие. [34]
Примеры: лямбда-исчисление Черча [5], система комбинаторов Карри [6], чистый Лисп [17], системы функционального программирования, описываемые в-этой статье. Основания: точные и полезные. [35]
Основные методы программирования и соответствующий образ мышления, представленные в первой части книги, отражают специфику классического функционального программирования, которое опирается в основном на лямбда-механизм и рекурсию. Однако Лисп - это один из редких Джон фон языков программирования, который пред - Нейман, лагает в рамках единого формализма возможности для большого разнообразия методов программирования, таких, например, как используемые в Бейсике и Фортране операторное программирование, фразовое программирования Паскаля, объектно-ориентированное программирование Смолтолка и, наконец, логическое программирование Пролога. Эта исключительная многосторонность объясняется хорошей теоретической основой языка, его независимостью от какой-либо конкретной архитектуры и его открытостью, гибкостью и расширяемостью. В этой главе мы рассмотрим наиболее важные модели и методы программирования, используемые в Лиспе. [36]
Ввиду важной роли, которую играет использование функций высших порядков стиль программирования применяемый для таких языков, называется функциональным программированием. Эти программы все еще аппликативны и основаны на аппликации и композиции функций как и в случае ламбда-исчисления. Оба стиля программирования поддерживают референциальную прозрачность, т.е. переменная или выражение в данной области действия всегда имеет одно и то же значение. [37]
Идея того, что функция является механически зафиксированным правилом преобразования входов в выходы - - есть одно из фундаментальных положений функционального программирования. Черный ящик является конструктивным блоком для функциональной программы, и с помощью объединения таких ящиков можно порождать более сложные операции. Такой процесс объединения ящиков называется функциональной композицией. [38]
В разделе Функциональное программирование - это очень просто описываются конструкции неожиданного для школьников ( принципиально нового для большинства из них) языка функционального программирования PROLAN / F, придуманного автором для этой задачи. Неожиданность языка - в отсутствии в нем таких привычных объектов, как переменные, циклы. Читателю предлагается дать на этом языке программы для решения нескольких задач, после чего приводятся их авторские решения. Полезность рассмотрения языка связана как с демонстрацией того, что могут быть разные принципы построения информационных моделей, так и в том, что функциональный подход получил большое развитие в широко распространяющемся языке Пролог. [39]
Хотя можно сделать предположение о связи метода вычисления лишь с эффективностью программы и ее компиляцией, различные эффекты в зависимости от способа вычислений в функциональном программировании простираются гораздо дальше, чем это может показаться на первый взгляд. В этой главе будет показано влияние различных видов вычислений на поведение функциональной программы и то, каким образом определенные классы задач полностью полагаются на тот факт, что аргументы функции не вычисляются в точке вызова. [40]
Полученный в результате язык имеет примерно такую же выразительную силу, как и подмножество языка Лисп первого порядка, и, хотя является ограниченным, может научить нас многим принципам функционального программирования. Заинтересованного читателя мы отсылаем к работе [11], где этот метод описан более детально. [41]
В чистом функциональном программировании специальные функции, изменяющие структуры, не используются. В функциональном программировании лишь создаются новые структуры путем анализа, расчленения и копирования ранее созданных структур. При этом созданные структуры никогда не изменяются и не уничтожаются структуры, значения которых уже не нужны. [42]
Наряду с функциональным программированием это основной используемый в Лиспе метод программирования, который поддерживается многими конструкциями языка. [43]
Язык программирования, в котором значения динамически присваиваются именам, но после присваивания значение имени не может быть изменено. Такие языки близки к языкам функционального программирования и связаны с потоковой архитектурой ЭВМ. [44]
Начиная с 50 - х годов нашего века компьютерная технология столкнулась с проблемой использования компьютера для символьных преобразований. Одно из решений этой задачи предлагает функциональное программирование. [45]