.
Язык F# для чайников. Урок 5. Теория функционального программирования.
Автор megabax   
31.03.2013 г.
New Page 1

Язык F# для чайников. Урок 5. Теория функционального программирования.

Это последний урок из серии "Язык F# для чайников", публикуемый в бесплатном разделе. Начиная со следующего, публикация уроков будет продолжена в платном разделе. В бесплатном же разделе возможно иногда будут публиковать некоторые статьи, посвященные методике программирования на F#.

И так, мы четыре урока посвятили некоторой практике работы с F#. Теперь углубимся в теорию -  настала пора узнать, для чего все таки нам нужно функциональное программирование. И так, F# - это функциональный язык программирования, поддерживающий так же императивное программирование и ООП. Функциональное программирование объединяет разные подходы к определению процессов вычисления на основе достаточно строгих абстрактных понятий и методов символьной обработки данных.  Вообще, функциональное программирование - это совсем другая парадигма программирования, основанная исключительно на функциях. В нем нет переменных, не может возникнуть побочных эффектов. В функциональном программировании можно писать более короткие программы, так как данный подход позволяет выражать свои мысли короче.

В императивном программировании мы можем записать вот такую конструкцию:

X=X+1

С точки зрения императивного программирования тут все верно -  мы увеличиваем значение переменной X на единицу. А вот любой математик скажет нам, что так быть не может. И будет прав, с точки зрения математики действительно X не может быть равно числу X, увеличенному на единицу. Суть функционального программирования как раз и заключатся в том, что бы писать программу не с точки зрения кодирования алгоритма, а именно с точки зрения математики. Чем этот подход лучше императивного принципа программирования? При традиционном подходе разработка программы делается в три шага:

  • Постановка задачи, разработка математической модели.

  • Разработка алгоритма

  • Кодирование алгоритма на языке программирования.
     

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

На урок 2 мы уже познакомились с понятием функций и функциональным программированием. Сегодня мы узнаем еще об одном понятии функционального программирования - лямбда выражении. Лямбда выражение - это константа функционального типа. Вот пример использования лямбда выражений:

let y=fun (x) -> x*x+1

System.Console.WriteLine(y(3));

System.Console.ReadLine();

Данная программа выдаст результат: 10.

А теперь, для демонстрации образа функционального мышления, рассмотрим решение квадратного уравнения в общем виде средствами языка F#:

//функция ввода числа с клавиатуры

let rec readFloat() =

    match System.Double.TryParse(System.Console.ReadLine()) with

    | false, _ -> printfn "?"; readFloat()

    | _, x -> x

 

//ввод с клавиатуры коэффициентов уравнения

let a = readFloat();

let b = readFloat();

let c = readFloat();

 

//зададим тип - результат решения квадратного уравнения

type ResultOfSolve=

    None

    |Linear of float

    |Quadratic of float*float

 

//зададим формулу решения квадратого уравнения в общем виде

let solve = fun (a,b,c) ->

    let D = b*b-4.0*a*c

    if a=0.0 then

        if b=0.0 then None else Linear(-c/b)

    else

        if D<0.0 then None else Quadratic(((-b+sqrt(D))/(2.0*a),(-b-sqrt(D))/(2.0*a)))

 

//решим квадратное уравнение

let res = solve(a,b,c);

 

//выведем результат

match res with

    None -> printf "Нет решений"

    |Linear(x) -> printf "Линейное уравнение, корень %f" x

    |Quadratic(x1,x2) -> printf "Квадратное уравнение, корни %f %f " x1 x2

 

System.Console.Read();

По сути, если перевести эту программу на русский язык, то мы получим примерно следующее рассуждение:

1. Зададим функцию ввода числа с клавиатуры: Вводим данные с клавиатуры, при вводе числа запоминаем, если это не число, то вводим число с клавиатуры (обратите внимание на рекурсию).

2. Используя функцию ввода числа с клавиатуры, вводим поочередно a, b и c.

3. Задами функцию решения уравнения: "Дискриминант вычисляется по формуле, D=b^2-4fc. Если a=0 то это линейное уравнение и оно имеет один корень -c/b, иначе если D<0 решений нет, иначе это квадратное уравнения с двумя корнями -b+sqrt(D))/(2a) и -b-sqrt(D))/(2*a)"

4. Решим уравнения используя заданную формулу.

5. Выведем результат: если решений нет то сообщить "Решений нет", если это линейное уравнение то вывести одно число, иначе выводим оба числа.