Автор работы: Пользователь скрыл имя, 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
// ------------------------------
// Печать целого
printfn "peekResult = %d" peekResult
// Универсальная печать
printfn "listC = %A" listC
Математически это множество определяется следующим образом: рассмотрим последовательность комплексных чисел Для различных 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# является, пожалуй, единственным функциональным языком программирования, который продвигается одним из ведущих производителей в области разработки программного обеспечения. Он позволяет использовать множество уже существующих библиотек, писать приложения для самых разных платформ и что не менее важно — делать всё это в современной IDE.
Информация о работе Функциональное программирование и язык F