Функциональное программирование и язык 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 Кб (Скачать файл)

Очень часто строгие языки включают в себя средства поддержки некоторых  полезных возможностей, присущих нестрогим  языкам, например бесконечных списков. В поставке Standard ML присутствует специальный  модуль для поддержки отложенных вычислений. А Objective Caml помимо этого  поддерживает дополнительное зарезервированное  слово lazy и конструкцию для списков  значений, вычисляемых по необходимости [4].

1.3 Задачи, решаемые в функциональном программировании

В качестве задач, традиционно рассматриваемых  в курсе функционального программирования, можно выделить следующие:

1. Получение остаточной процедуры. 

Если даны следующие объекты:

P (x1, x2, ..., xn) — некоторая процедура.

x1 = a1, x2 = a2 — известные значения параметров.

x3, ..., xn — неизвестные значения параметров.

Требуется получить остаточную процедуру P1 (x3, ..., xn). Эта задача решается только на узком классе программ.

2. Построение математического описания  функций. 

Пусть имеется программа P. Для неё  определены входные значения <x1, ..., xn> и выходные значения <y1, ..., ym>. Требуется построить математическое описание функции f : Dx1 . ... . Dxn → Dy1 . ... . Dym.

3. Определение формальной семантики  языка программирования.

4. Описание динамических структур  данных.

5. Автоматическое построение «значительной»  части программы по описанию  структур данных, которые обрабатываются  создаваемой программой.

6. Доказательство наличия некоторого  свойства программы. 

7. Эквивалентная трансформация  программ [5]

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

  1. Язык F#

F# — это мультипарадигменный  язык программирования, разработанный  в подразделении Microsoft Research и предназначенный  для исполнения на платформе  Microsoft .NET. Он сочетает в себе  выразительность функциональных  языков, таких как OCaml и Haskell с  возможностями и объектной моделью  .NET.

История F# началась в 2002 году, когда  команда разработчиков из Microsoft Research под руководством Don Syme решила, что  языки семейства ML вполне подходят для реализации функциональной парадигмы  на платформе .NET. Идея разработки нового языка появилась во время работы над Generic’ами — реализацией обобщённого  программирования для Common Language Runtime. Известно, что одно время в качестве прототипа  нового языка рассматривался Haskell, но из-за функциональной чистоты и более  сложной системы типов потенциальный Haskell.NET не мог бы предоставить разработчикам  простого механизма работы с библиотекой  классов .NET Framework, а значит, не давал  бы каких-то дополнительных преимуществ. Как бы то ни было, за основу был взят OCaml, язык из семейства ML, который не является чисто функциональным и  предоставляет возможности для  императивного и объектно-ориентированного программирования. Haskell, хоть и не стал непосредственно родителем нового языка, тем не менее, оказал на него некоторое влияние. Например, концепция  вычислительных выражений (computation expressions или workflows), играющих важную роль для  асинхронного программирования и реализации DSL на F#, позаимствована из монад Haskell.

Следующим шагом в развитии нового языка стало появление в 2005 году его первой версии. С тех пор  вокруг F# стало формироваться сообщество. За счёт поддержки функциональной парадигмы  язык оказался востребован в научной  сфере и финансовых организациях. Во многом благодаря этому Microsoft решила перевести F# из статуса исследовательских  проектов в статус поддерживаемых продуктов  и поставить его в один ряд  с основными языками платформы .NET. И это несмотря на то, что в  последнее время всё большую  активность проявляют динамические языки, поддержка которых также  присутствует в .NET Framework. 12 апреля 2010 года свет увидела новая версия флагманского продукта для разработчиков — Microsoft Visual Studio 2010, которая поддерживает разработку на F# прямо из коробки.

2.1 Состав инсталляционных пакетов F#

Исполняемый файл fsi.exe, входящий в комплект поставки F#, представляет собой интерактивную консоль, в которой можно быстро проверить работоспособность отдельных фрагментов кода на F#.

В состав современных инсталляционных  пакетов F# входят также модули интеграции в Visual Studio 2008 и свободно распространяемую Visual Studio 2008 Shell, которые позволяют компилировать участки кода прямо из редактора. Это средство видится авторам наиболее удобным для первоначального знакомства с языком, так как открыв текст программы во встроенном редакторе кода, можно отправлять выделенные участки на исполнение простым нажатием комбинации клавиш Alt+Enter.

Исполняемый файл fsc.exe — непосредственно компилятор исходного кода F#, который читатель может использовать совместно со своим любимым текстовым редактором.

Утилиты fsc.exe и fsi.exe отлично работают и под Mono, открытой реализацией .NET Framework.

Файлы, содержащие код на F#, обычно имеют следующие расширения:

  • .fs — обычный файл с кодом, который может быть скомпилирован;
  • .fsi — файл описания публичного интерфейса модуля. Обычно генерируется компилятором на основе кода, а затем редактируется вручную;
  • .fsx — исполняемый скрипт. Может быть запущен прямо из Windows Explorer при помощи соответствующего пункта всплывающего меню или передан на исполнение в интерактивную консоль fsi.exe.

В некоторых источниках можно  встретить в начале F# кода директиву #light on. Эта директива отключает режим совместимости синтаксиса с OCaml, делая отступы в коде значимыми (как, например в Python или Haskell). В последних версиях облегчённый режим включен по умолчанию, поэтому необходимости в указании директивы #light больше нет [4].

2.2 Основные возможности языка

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

F# поддерживает следующие конструкции  функционального программирования:

  1. Функции в качестве значений — позволяет гибко управлять функциями.
  2. Объединение и конвейеризация функций — позволяет объединять функции для создания новых функций и упрощения кодирования последующих операций с данными.
  3. Определение типа — устраняет необходимость явно вызывать типы без ущерба для безопасности типа.
  4. Автоматическое обобщение — позволяет повторно использовать код, упрощая написание кода, который работает с множеством разных типов без дополнительных усилий.
  5. Поддержка сопоставления шаблонов, упрощающая сложный код условия, и размеченные объединения, которые оптимизируются для использования с сопоставлением шаблонов.
  6. Типы коллекций для работы с неизменяемыми данными, включая типы list и sequence.
  7. Лямбда-выражения — важны для многих конструкций функционального программирования.
  8. Частичное применение аргументов функций — обеспечивает возможность неявного создания новых функций из существующих.
  9. Кавычки кода — функция, позволяющая программно манипулировать выражениями языка F#.

F# поддерживает объектно-ориентированное  программирование и следующие  возможности платформы .NET Framework:

  1. Объектная модель платформы .NET Framework, в том числе объекты, имеющие свойства, методы и события; полиморфизм или виртуальные функции; наследование и интерфейсы.
  2. Инкапсуляция данных или отделение открытого интерфейса типа от реализации.
  3. Перегрузка операторов, хорошо работающая с универсальными шаблонами и встроенными простыми типами.
  4. Расширения типа, позволяющие легко расширить существующий тип без дополнительных непроизводительных действий по созданию нового производного типа.
  5. Выражения объектов, позволяющие при необходимости неявно определять небольшие объекты в выражениях вместо объявления нового типа и создания экземпляра объекта.
  6. Доступ к платформе .NET Framework и любым сборкам управляемого кода.
  7. Доступ к машинному коду посредством вызова неуправляемого кода.

Visual F# в Visual Studio 2012 расширяет язык F# для поддержки информационно-насыщенного  программирования в F#. Эта технология  позволяет программировать непосредственно  в больших пространствах данных  и служб, которые часто сегодня  преобладают в промышленном и  веб программировании, таких как  базы данных, веб-службы, веб-каналы  данных и брокеры данных.

Информационно-насыщенное программирование на F# фокусируется на коде и может  использоваться как в скриптах, так  и в проектах. Оно также позволяет  указывать подключения к базе данных SQL Server и OData непосредственно  в коде, определяя строгие типы с помощью IntelliSense. Механизм является расширяемым, позволяя записывать или  ссылаться на новые поставщики для  данных, кода и технологий, таких  как SharePoint, веб-онтологий, инструментария управления Windows (WMI), XML и другие источники  информации. Технически информационно-насыщенное программирование в F# включает в себя механизмы поставщиков типов F#, Выражения запросов F# и набор встроенных поставщиков типа для базы данных, OData и программирование веб-служб.

F# также поддерживает все основные  конструкции императивного программирования, такие как конструкции ветвления  и циклические конструкции. 

2.3 Библиотеки F#

Visual F# содержит также библиотеку F#, которая имеет много полезных  функций и типов. К ним относятся  интерфейсы API для таких коллекций,  как lists, arrays, maps, sets и sequences. Библиотека F# также поддерживает отражение,  события и форматированный ввод-вывод. 

Кроме того, библиотека F# поддерживает асинхронные рабочие процессы для  обеспечения параллельных вычислений и механизмы для связи между  параллельными рабочими процессами. Дополнительные сведения см. в разделах Асинхронные рабочие потоки (F#), Класс Control.Async (F#) и Класс Control.MailboxProcessor<'Msg> (F#).

FSharp.Core.dll — основная библиотека F#. Дополнительные библиотеки можно  найти в пакете PowerPack языка F#, доступном  на веб-сайте Центра разработчиков  Microsoft F#.

Отдельно скомпилированные основные версии библиотеки F# существуют, чтобы  поддерживать различные версии .NET Framework. Версия 2.0 поддерживает .NET Framework 2.0, 3.0 и 3.5, а 4.0 поддерживает платформу .NET Framework 4 и более поздние версии платформы .NET Framework. Кроме того, для загрузки доступны версии библиотеки ядра F# для Silverlight [5].

2.4 Основные понятия языка F#

2.4.1 Выражения

Базовый элемент синтаксиса F# –  это выражение. Примеры выражений:

  • 3+ 5 + 3
  • (1 + 2) ∗ (3 + 4)
  • "Hello"
  • "Hello " + "_World"
  • intToString 5
  • "Hello_World" + 1

Результатом вычисления выражения  является значение. Значение будем  отделять от выражения символом =>:

  • 11 => 11
  • 3+ 5 + 3 => 11
  • (1 + 2) ∗ (3 + 4) => 21
  • "He l lo " => "He l lo "
  • "He l lo " + "_World" => "He l lo_World"
  • intToString 5=> "5"
  • "Hello_World" + 1 − ошибка !

Значение получается из выражения  в процессе вычисления. Будем обозначать один шаг вычисления символом |->. Например:

(1 + 2) ∗ (3 + 4)

|−> 3 ∗ (3 + 4)

|−> 3 ∗ 7

|−> 21

Вычисления могут происходить  последовательно, как в предыдущем примере, или параллельно. Во втором случае, независимые друг от друга  выражения вычисляются одновременно:

(1 + 2) ∗ (3 + 4)

|−> 3 ∗ 7

|−> 21

2.4.2 Типы

Значение ”Hello World” + 1 не будет вычислено потому, что оно некорректно типизировано (ill-typed). В F# каждое выражение имеет тип. Тип выражения говорит о том, какие значения могут получиться при вычислении этого выражения и получатся ли какие-нибудь значения вообще. Выражение корректно типизировано (well-typed), если у него есть как минимум один тип. У выражения может быть более одного типа – это называется полиморфизм. Теория типов базируется на идеях Б. Рассела и А. Уайтхеда. Они предложили сопоставлять высказыванию (пропозициональной функции) некоторый тип, который является его доменом или областью определения. Иерархия, составленная из таких типов, должна была разрешить парадоксы наивной теории множеств и послужить основанием математики.

Будем записывать тип выражения  в формате hexpi : htypei. В общем случае, тип задаётся набором значений, которые могут принимать выражения этого типа и набором операций над типом. Например:

  • 11 : int
  • "Hello" : string
  • "Hello_World" + 1 − ошибка !

2.4.3 Декларации

Программа на F# состоит из деклараций. Рассмотрим декларацию переменных:

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