Yvision.kz
kk
Разное
Разное
399 773 постов41 подписчиков
Всяко-разно
-8
01:09, 01 ноября 2014

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

Вчера сходил на 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
467
2