На прошлом уроке мы рассмотрели основные понятия функционального программирования, теперь давайте попробуем применить их на практике. Поскольку функциональное программирование, как вы наверное поняли, идеально подходит для решения математических задач, то рассмотрим именно такую задачу — построение изображения множества Мандельброта, самого известного фрактального множества.   Математически, множество Мандельброта определяется следующим образом. Рассмотрим последовательность комплексных чисел z(n+1) = z(n)^2+c, z(0)=0. Для различных c эта последовательность либо сходится, либо расходится Например, для c=0 z(i) = 0, а для c=2 имеем расходящуюся последовательность. Так вот, множество Мандельброта — это множество тех c, для которых последовательность сходится.  Переходим к реализации алгоритма на F#. Для начала, определим исходную функцию  Здесь нам пришлось в явном виде указать тип Complex (это надо сделать хотя бы для одной из переменных, но мы для симметрии сделали для двух), поскольку по умолчанию для операции + полагается целый тип. Для того, чтобы тип Complex стал доступен, в начале придется указать преамбулу: Чтобы проверить сходимость, мы примем небольшое допущение. Будем считать, что последователность сходится, если |z(20)|<1. Для вычисления z(20) используем следующую функцию многократной композиции, рекурсивно применяющую указанную функцию заданное число раз: Здесь знак >> обозначает композицию функций, а запись fun x->x — тождественную функцию. Вообще говоря, конструкция fun x -> ... позволяет нам задать функциональную константу, т.е. выражение типа функции от одного аргумента. Например, следующие две конструкции — эквивалентны: В нашем случае функция rpt принимает один аргумент целого типа n (число повторений), и некоторую функцию f, т.е. имеет тип rpt: int -> ('a -> 'a) -> ('a -> 'a). Для n=0 возвращается тождественная функция, а для n>0 — композиция f и (n-1)-кратного применения f. Запись 'a означает полиморфный тип, т.е. вместо него может быть любой допустимый тип данных. Возврящаясь к нашей задаче, вспомним, что для фиксированного c частичное применение каррированной функции (mandelf c) будет функцией одного аргумента (x), и применим к этой функции функцию многократной композиции. В результате, |z(20)| вычислится как rpt 20 (mandelf c) (Complex.zero). Действительно, rpt 20 (mandelf c) будет обозначать 
20-кратное применение функции mandelf с, которое затем мы применяем к 0. Тогда функция принадлежности комплексного числа к множеству Мандельброта запишется как 
 Остальное — дело техники. Определяем функцию масштабирования scale (она будет в качестве аргументов брать пары чисел — диапазоны изменения переменных типа float*float и 
int*int), и в двойном цикле печатаем множество на консоли: Но это ещё не всё! Вспомним, что программисту на F# доступна вся мощь платформы Microsoft.NET! Поэтому мы можем построить графическое изображение в окне, используя 
Windows Forms и библиотеку System.Drawing! Соответствующий код: Что из этого получилось — см. на картинке ниже:  Конечно, для получения полноценного цветного изображения множества Мандельброта на F# надо ещё немного поработать! Предоставляю моим читателям сделать это в качестве 
упражнения. Если получится — пишите в комментариях! Облачный адвокат