Функциональное программирование — что это?

Hes 2014 M11 1
358
2
1
0

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

Вчера сходил на IT Crowd. Открытая конференция разработчиков.

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

Мне бы хотелось добавить больше научности и больше конкретики:)

Геттеры и сеттеры - для чего нужны и как на самом деле они называются?

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

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

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

Для упрощения построения (компоновки) сетеров (и гетеров) неизменяемых структур данных удобно использовать инструмент линзы.


  1. class Lens<TObject, TProperty>
  2. {
  3. public Func<TObject, TProperty> Get {get; private set;}
  4. public Action<TObject, TProperty> Set {get; private set;}
  5.  
  6. public Lens(Func<TObject, TProperty> getter, Action<TObject, TProperty> setter)
  7. {
  8. Get = getter;
  9. Set = setter;
  10. }
  11. }

Пример использования:


  1. class Person
  2. {
  3. public string Name {get;set;}
  4. public int Age {get;set;}
  5. }
  6.  
  7. void Main()
  8. {
  9. // Линза для имени
  10. var name = new Lens<Person,string>(p => p.Name, (p, v) => p.Name = v);
  11.  
  12. // Линза для возраста
  13. var age = new Lens<Person,int>(p => p.Age, (p, v) => p.Age = v);
  14.  
  15. var person = new Person {Name = "Вася", Age = 30};
  16.  
  17. // Выведем имя и возраст
  18. name.Get(person).Dump(); // output: Вася
  19. age.Get(person).Dump(); // output: 30
  20.  
  21. // Установим при помощи линзы имя.
  22. name.Set(person, "Петя");
  23. name.Get(person).Dump(); // output: Петя
  24. }

Такой приём часто используется множеством различных ORM - данные напрямую менять нельзя, но при помощи линз - вспомогательных методов, запросто можно нарисовать обёртки для чтения-записи куда и откуда угодно. Побочных эффектов от ввода-вывода можно избежать, используя монаду IO.

Каррирование.

Материал из Википедии — свободной энциклопедии

Каррирование или карринг (англ. currying) в информатике — преобразование функции от многих аргументов в функцию, берущую свои аргументы по одному.


  1. Func<int, Func<int, int>> curry = (x => (y => x + y));
  2. var xx = curry(4)(5);
  3. Console.WriteLine(xx); //9
  4. var yy = curry(4);
  5. Console.WriteLine(yy(5)); //9

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

Чистота функций.

Материал из Википедии — свободной энциклопедии

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

является детерминированной;

не обладает побочными эффектами.

Оцените пост

-8

Комментарии

1
Ошибок у меня, разумеется, было довольно много. Следовало готовиться получше %)
Но я всё-таки знаком с функциональной парадигмой. На самом деле, мой путь в этом направлении начался с СИКПа, так что не знаком с ней я быть не могу. Ну и в последнее время балуюсь хаскелем во имя добра :3
Я озаглавил свой доклад "метапрограммирование" по той простой причине, что главной целью было показать, как мы можем создавать программы, которые создают программы. И как это можно использовать в реальных проектах. Само собой разумеется, что для этих целей будут активно использоваться замыкания (clojures), каррирование, замена функций (декораторы) и многое другое. Это всё необходимо для самомодификации кода во время исполнения. Поэтому я счёл нужным посвятить львиную долю лекции именно этим вещам, поскольку большинство с ними попросту не знакомо.

Тут вот мой пэт-проджект, к которому я подводил: bitbucket.org Это, вернее сказать, ядро. Пример, который я привёл в конце, основан вот на этом эксперименте: bitbucket.org
Здесь я храню данные о принимаемых параметрах и принципах их обработки в базе данных. Это вот и есть метапрограммирование. Поведение целевой функции будет меняться в зависимости от данных, которые могут изменяться во время исполнения программы.

С уважением, Данияр.
-9
Вообще, хорошо, что хоть кто-то раскрывает темы ФП. По возможности я и дальше буду писать статьи на эту тему.
Насчёт поведения целевой функции, а что если рассматривать входящие данные как разнородный поток данных? Соответственно, заранее определить набор функций, запомнить их в словаре ключ-значение, и по ключам производить вызов нужной функции?
Показать комментарии