5.3 ЗАДАЧИ ФУНКЦИОНАЛЬНОГО ПРОГРАММИРОВАНИЯ (Лебедев Иван)


Идея функционального программирования опирается на интуитивное понятие о функциях как о достаточно общем механизме представления и анализа решений сложных задач. 

Механизм функций основательно изучен математиками, и это позволяет программистам наследовать выверенные построения, обладающие предельно высокой моделирующей силой. Систематическое применение функционального программирования впервые достаточно ярко было продемонстрировано Джоном Маккарти и его учениками в методах реализации языка Лисп и программирования на этом языке. Наиболее очевидные из этих методов были успешно ассимилированы другими языками и системами программирования. Обычно про функциональное программирование вспоминают при смене технологий, когда возрастает роль аналитики и исследовательских задач. В настоящее время часто употребляют термин "функциональность" при сравнительной характеристике информационных систем, что, видимо, свидетельствует о проявлении новой метрики, заслуживающей отдельного рассмотрения.

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

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

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

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

Большинство систем программирования разработано с ориентацией на расширение, уточнение и настройку пользователем реализованных программных средств, свойства которых определены и обеспечены в процессе разработки. Такое разделение труда естественно при ориентации на решение задач с исчерпанным или четко ограниченным исследовательским компонентом. Но исходная разработка любой системы включает фазу формирования базиса и наполнения ядра системы в терминах, которые не сводятся к ее языку. Это позволяет независимо рассматривать один еще более общий уровень — аппликативные системы, в которые можно включать любые символы с определенным смыслом. Поведение такой системы будет обусловлено набором включенных в нее символов.

Основная трудность перехода к функциональному программированию — соблазн легкого пути, т.е. стремление быстро смоделировать привычные средства и методы программирования. 
Более надежный путь — исследовать функциональное программирование как незнакомый мир. Идеи функционального программирования легче воспринять как самостоятельную теорию или интеллектуальную игру, которая новыми путями непременно приведет к знакомым и интересным задачам, но обеспечит преимущество — изящные решения и глубину понимания.

Джон Маккарти предложил проект языка Лисп (LISP - LIStProcessing) в качестве средства исследования границ применимости компьютеров, в частности, методом решения задач искусственного интеллекта. Идеи этого языка вызвали не утихающие по сей день дискуссии о приоритетах в программировании и сущности программирования. Лисп послужил эффективным инструментом экспериментальной поддержки теории программирования и развития сферы его применения. Рост интереса к Лиспу коррелирует с улучшением элементной базы, повышением эксплуатационных характеристик оборудования и появлением новых сфер применения ИТ.
Существует и активно применяется более трехсот диалектов Лиспа и родственных ему языков: Interlisp, muLisp, Clisp, Scheme, ML, Cmucl, Logo, Hope, Sisal, Haskell, Miranda и др.

  • http://www.haskell.org - очень насыщенный сайт, посвященный функциональному программированию в общем и языку Haskell в частности. Содержит различные туториалы, список интерпретаторов и компиляторов Haskell-а (в настоящий момент все интерпретаторы и компиляторы - freeware). Кроме того, имеется обширный список интересных ссылок на ресурсы по теории функционального программирования и другим языкам (Standard ML, Clean). Очень рекомендую.
  • http://cm.bell-labs.com/cm/cs/what/smlnj - Standard ML of New Jersey. Очень хороший компилятор. В бесплатный дистрибутив помимо компилятора входят утилиты MLYacc и MLLex и библиотека Standard ML BasisLibrary. Отдельно можно взять документацию по компилятору и библиотеке.
  • http://www.harlequin.com/products/ads/ml/ - HarlequinMLWorks, коммерческий компилятор Standard ML. Однако в некоммерческих целях можно бесплатно пользоваться версией с несколько ограниченными возможностями.
  • http://caml.inria.fr - институт INRIA. Домашний сайт команды разработчиков языков CamlLight и ObjectiveCaml. Можно бесплатно скачать дистрибутив ObjectiveCaml, содержащий интерпретатор, компиляторы байт-кода и машинного кода, Yacc и Lex для Caml, отладчик и профайлер, документацию, примеры. Качество компилированного кода у этого компилятора очень хорошее, по скорости опережает даже Standard ML ofNewJersey.
  • http://www.cs.kun.nl/~clean/ - содержит дистрибутив компилятора с языка Clean. Компилятор коммерческий, но допускается бесплатное использование в некоммерческих целях. Из того что компилятор коммерческий следует его качество (очень быстр), наличие среды разработчика, хорошей документации и стандартной библиотеки


функциональное программирование

функциональное программирование

  1. Функциональное программирование относится к?

    императивному программированию
    объектно-ориентированному программированию
    декларативному программированию
  2. Декларативный подход в программировании требует ?

    описывать последовательность действий и свойства требуемого результата
    описывать свойства требуемого результата
    описывать последовательность действий для нахождения результата
  3. К особенностям декларативных языков программирования относятся:?

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

    Lisp, Haskell, Prolog, O’Caml, F#, Clean
    Lisp, Scheme, Miranda, Haskell, O’Caml, F#, Erland
    ) Lisp, Haskell, F#, C#, C++, Object Pascal
    Lisp, Miranda, Haskell, JavaScript, Visual Prolog, O’Caml, F#, Erland

  5. К языкам логического программирования относятся?

    Prolog, Visual Prolog
    Haskell, Cofer
    Prolog, F#.
  6. Язык функционального программирования F# наследует от языков?

    O’Caml, Haskell
    Lisp, Haskell
    Lisp, O’Caml
  7. Базовый элемент синтаксиса F#?

    константа
    объект
    выражение
    класс

  8. Функции в F# объявляются конструкцией?

    let <имя функции> (<аргумент функции>) = <тело функции>
    <имя функции> (<аргумент функции>) : = <тело функции>
    let <тип функции> <имя функции> (<аргумент функции>) : {<тело функции>}
  9. Функция let plus x y = x+y;; будет иметь тип?

    int -> int
    int -> int -> int
    int*int -> int
  10. Тип выражения говорит о том?

    ) имеет ли выражение какое-нибудь значение или нет
    type -какие значения могут получиться при вычислении этого выражения
    какие значения могут получиться при вычислении этого выражения и получатся ли какие-нибудь значения вообще


    

Комментарии

Популярные сообщения из этого блога

1.1 ИСТОРИЯ РАЗВИТИЯ ИСКУССТВЕННОГО ИНТЕЛЛЕКТА КАК НАУЧНОГО НАПРАВЛЕНИЯ (Маячкин Александр)

3.2 ВИДЫ ЭКСПЕРТНЫХ СИСТЕМ И ТИПЫ РЕШАЕМЫХ ЗАДАЧ (Ермолаева-Синицына Анна)

3.6 ИНТЕЛЛЕКТУАЛЬНЫЕ ИНФОРМАЦИОННЫЕ СИСТЕМЫ (Богаткин Олег)