Функциональное программирование и язык F

Автор работы: Пользователь скрыл имя, 18 Ноября 2013 в 19:25, реферат

Описание работы

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

Содержание работы

ВВЕДЕНИЕ 3
1 Функциональное программирование 4
1.1 История функционального программирования 4
1.2 Свойства функциональных языков 7
1.3 Задачи, решаемые в функциональном программировании 12
2 Язык F# 13
2.1 Состав инсталляционных пакетов F# 14
2.2 Основные возможности языка 15
2.3 Библиотеки F# 17
2.4 Основные понятия языка F# 17
2.4.1 Выражения 17
2.4.2 Типы 18
2.4.3 Декларации 19
2.4.4 Проверка и вывод типов 20
2.4.5 Функции 21
2.4.6 Функциональный тип 21
2.5 Работа в F# 23
2.5.1 Примеры кода 23
2.5.2 Пример – построение множества Мандельброта 26
ЗАКЛЮЧЕНИЕ 31
СПИСОК ИСПОЛЬЗУЕМЫХ ИСТОЧНИКОВ 32

Файлы: 1 файл

Функциональное программирование и язык F.docx

— 584.92 Кб (Скачать файл)

// ---------------------------------------------------------

// Печать целого

printfn "peekResult = %d" peekResult

// Универсальная печать результата  с помощью %A

printfn "listC = %A" listC

2.5.2 Пример – построение множества Мандельброта

Математически это множество определяется следующим  образом: рассмотрим последовательность комплексных чисел  Для различных c эта последовательность либо сходится, либо расходится. Например, для c = 0 все элементы последовательности = 0, а для c = 2 имеем расходящуюся последовательность. Множество Мандельброта – это множество тех c, для которых последовательность сходится.

Реализация  алгоритма построения на F#:

Определим функцию mandelf, описывающую последовательность , – при этом необходимо в явном виде указать для аргументов тип Complex1, поскольку по умолчанию для операции + полагается целый тип. Кроме того, чтобы тип Complex стал доступен, вначале придется указать преамбулу, открывающую соответствующие модули:

open System

open Microsoft.FSharp.Math

let mandelf (c:Complex) (z:Complex) = z*z+c

Следующим этапом определим функцию ismandel: Complex->bool, которая будет по любой точке комплексной плоскости выдавать признак ее принадлежности множеству Мандельброта. Для простоты мы будем рассматривать слегка видоизмененное множество, похожее на множество Мандельброта – множество тех точек, для которых (0) является ограниченной величиной, то есть по модулю меньше 1.

Функция mandelf описана в каррированном представлении и при некотором фиксированном c представляет собой функцию из Complex в Complex. Таким образом, используя описанную ранее функцию n-кратного применения функции rpt, мы можем построить 20-кратное применение функции mandelf rpt 20 (mandelf c). Далее остается применить эту функцию к нулю и взять модуль значения:

let ismandel c = Complex.Abs(rpt 20 (mandelf c) (Complex.zero))<1.0

По сути дела, эти две строчки – описание функций mandelf и ismandel – определяют нам множество Мандельброта. Построить это множество – для начала в видерисунка из звездочек на консоле – теперь дело техники и нескольких строк кода:

let scale (x:float,y:float) (u,v) n = float(n-u)/float(v-u)*(y-x)+x;;

for i=1 to 60 do

for j=1 to 60 do

let lscale = scale (-1.2,1.2) (1,60) in

let t = complex (lscale j) (lscale i) in

Console.Write(if ismandel t then "*" else " ")

Console.WriteLine("")

Результат работы программы в консольном режиме можно наблюдать на рис. 2. Для получения такого результата мы преобразовали программу в самостоятельное F#-приложение – файл с расширением .fs, который затем можно откомпилировать из Visual Studio либо с помощью утилиты fsc.exe в независимое выполняемое приложение.

Рисунок 2 – Работа программы в консольном режиме

Таким образом, программа, отвечающая за построение множества  Мандельброта, уместилась, по сути дела, на одном экране компактного кода. Если проанализировать причины, по которым программа получилась существенно компактнее возможных аналогов на C#, можно отметить следующее:

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

Построение множества Мандельброта из звездочек впечатляет, но было бы еще интереснее построить графическое изображение с большим разрешением. К счастью, F# является полноценным языком семейства .NET и может использоваться совместно со всеми стандартными библиотеками .NET, такими как System.Drawing для манипулирования двумерными изображениями и даже библиотекой Windows Forms.

Код, строящий фрактальное изображение в отдельном  окне:

open System.Windows.Forms

let form =

let image = new Bitmap(400, 400)

let lscale = scale (-1.2,1.2) (0,image.Height-1)

for i = 0 to (image.Height-1) do

for j = 0 to (image.Width-1) do

let t = complex (lscale i) (lscale j) in

image.SetPixel(i,j,

if ismandel t then Color.Black else Color.White)

let temp = new Form()

temp.Paint.Add(fun e -> e.Graphics.DrawImage(image, 0, 0))

temp.Show()

temp

В начале программы подключаем библиотеки Windows Forms и System. Drawing. Основная функция – form – отвечает за создание основного окна с фрактальным изображением. В этой функции сначала создается объект Bitmap – двумерный пиксельный массив, который заполняется фрактальным изображением с помощью двойного цикла, похожего на использованные в предыдущем примере.

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

Рисунок 3 – Работа программы в оконном режиме

 

Программа в таком виде имеет недостаточно богатый интерфейс, да и процесс построения формы через переопределение функции перерисовки не является самым правильным. Основная цель данного примера – показать, что F# может прозрачным образом работать со всем имеющимся многообразием функций платформы .NET, от графических примитивов до сетевого взаимодействия, от доступа к СУБД до построения Silverlight-приложений.

Предполагается, что для построения интерфейсов приложений с использованием визуальных дизайнеров будут по-прежнему использоваться императивные языки, а F# сможет эффективно применяться для решения задач, связанных с обработкой данных. Грамотное разделение кода и используемого языка программирования между отдельными модулями – это необходимое условие успешности и эффективности разработки программного проекта.

ЗАКЛЮЧЕНИЕ

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

Если предположить, что используемый язык программирования влияет на то, как  программист видит решение проблемы, то нельзя не признать, что F# будет подталкивать его к поиску более простых  и элегантных решений.

В том, что F# найдет широкое применение в финансовой сфере и в области  статистики. Помимо этого, F# заслуживает  того, чтобы стать достаточно популярным в других областях, хотя бы потому, что  делает многопоточное программирование проще и понятнее.

Следует также отметить, что на данный момент F# является, пожалуй, единственным функциональным языком программирования, который продвигается одним из ведущих  производителей в области разработки программного обеспечения. Он позволяет  использовать множество уже существующих библиотек, писать приложения для самых  разных платформ и что не менее  важно — делать всё это в современной IDE.

 

СПИСОК ИСПОЛЬЗУЕМЫХ ИСТОЧНИКОВ

  1. Филд А., Харрисон П. Функциональное программирование: Пер. с англ. ― М.: Мир, 1993. ―  637 с., ил.
  2. Хендерсон П. Функциональное программирование. Применение и реализация. М.: Мир, 1983.
  3. Электронная библиотека по теме: "Исследования возможностей функциональных языков для реализации трансляторов" [Электронный ресурс] / Введение в функциональное программирование. — Режим доступа: http://www.uran.donetsk.ua/~masters/2002/fvti/drugobitskiy/library/functional_programming.html.— Дата доступа: 01.11.2013.
  4. Сошников Д. В. Программирование на F#. – М.: ДМК Пресс, 2011. – 192 с.: ил.
  5. Душкин Р.В. Функциональное программирование на языке Haskell – М.: ДМК Пресс, 2008. – 608 с.: ил.

 


Информация о работе Функциональное программирование и язык F