Кремниевая долина в 1936 году.

Кремниевая долина наши дни.

RIA

(Rich internet application)

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

Деревья

(Связные структуры)

Document

Head

Body

Meta

Title

#layout

main

aside

footer

Деревья

(Обход в глубину)

Document

Head

Body

Meta

Title

#layout

main

aside

footer

1. document

   2. head

        3. meta

        4. title

   5. body

        6. #layout

            7. aside

            8. main

            9. footer

Document

Head

Body

Meta

Title

#layout

main

aside

footer

Learning to Drive

Your First Spaceship

 

NO REVERSE?! HOW THE HELL AM I SUPPOSED TO DRIVE WITHOUT REVERSE?!

WHAAT?!

"… иногда шаг вперед  это  два шага назад"

  • Учит мыслить базовыми понятиями программирования, а не текущего фреймворка;

 

  • Позволяет писать эффективные программы благодаря реализации принципа конкурентного программирования

Forget Everything You Know

Многие вещи, к которым мы привыкли в обычном программировании не справедливы для функционального

Purity

Все функции — чистые

  1. Функция, вызываемая от одних и тех же аргументов, всегда возвращает одинаковое значение.
function add(x, y) {
   return x + y;
}

let add = (x, y) => x + y;
function justTen() {
   return 10;
}

let justTen = () => 10;
function addNoReturn(x, y) {
    let z = x + y
}

эффективная PF всегда принимает хотя бы один аргумент

эффективная PF всегда должна что-то возвращать

2. Во время выполнения функции не возникают побочные эффекты (изменение чего-то отличного от функции, которая исполняется в текущий момент).

let number = 1;
const increment = () => number += 1;
const increment = n => n + 1;
const increment = n => console.log(n + 1);
writeFile(fileName);

updateDatabaseTable(sqlCmd);

sendAjaxRequest(ajaxRequest);

openSocket(ipAddress);

 “HOW THE HELL DO I DO ANYTHING WITH ONLY PURE FUNCTIONS?!”

Цель: минимизировать влияние нечистых функций и ограничить их от остальной части программы.

Immutability

Переменные неизменяемы

Нельзя изменять переменную после её инициализации. Можно лишь создавать новые, но не изменять существующие.​ Нет никаких переменных!

!

let x = 1;
x = x + 1;
addOneToSum y z =
    let
        x = 1
    in
        x + y + z
const addOneToSum = (y, z, x = 1) => y + z + x

 “HOW THE HELL AM I SUPPOSED TO DO ANYTHING WITHOUT VARIABLES?!”​

 

Как быть?

При необходимости изменения значения переменной или объекта

1

let x = 1;
let y = x + 1;

2

При реализации циклов

делаем копию.

!

Никаких циклов с конструкциями for, while, do, repeat 

let acc = 0;
for (let i = 1; i <= 10; ++i)
   acc += i;

“WHAT?!

NO VARIABLES AND NOW NO LOOPS?!

ARE YOU KIDDING ME?”

function sumRange() {
    let acc = 0;
    for (var i = 1; i <= 10; ++i) {
       acc += i;
    }
    return acc
}

let sumRange = (acc=0) => 
               acc < 10 ? sumRange(acc+=1) 
                        : acc
function sum(start, end, acc) {
   if (start > end)
       return acc;
   return sumRange(start + 1, end, acc + start)
}

let sum = (start, end, acc) =>
               start > end ? acc 
               : sum(start + 1, end, acc + start)
sumRange start end acc =
    if start > end then
        acc
    else
        sumRange (start + 1) end (acc + start) 

sumRange 1 10 0 =  -- sumRange (1 + 1)  10 (0 + 1)
sumRange 2 10 1 =  -- sumRange (2 + 1)  10 (1 + 2)
sumRange 3 10 3 =  -- sumRange (3 + 1)  10 (3 + 3)
sumRange 4 10 6 =  -- sumRange (4 + 1)  10 (6 + 4)
sumRange 5 10 10 = -- sumRange (5 + 1)  10 (10 + 5)
sumRange 6 10 15 = -- sumRange (6 + 1)  10 (15 + 6)
sumRange 7 10 21 = -- sumRange (7 + 1)  10 (21 + 7)
sumRange 8 10 28 = -- sumRange (8 + 1)  10 (28 + 8)
sumRange 9 10 36 = -- sumRange (9 + 1)  10 (36 + 9)
sumRange 10 10 45 = -- sumRange (10 + 1) 10 (45 + 10)
sumRange 11 10 55 = -- 11 > 10 => 55
55

Рекурсия - всему голова. Ну, или хвост. Там как пойдёт..

Иммутабельность (неизменность, постоянство)

 это защита от самого себя.

Higher-Order Functions

Первоклассные функции высшего порядка

1. Первоклассная - объявленная как переменная.

2. Функции высшего порядка принимает другую функцию как аргумент или возвращающие функцию.

const sum = (x, y) => x + y;
const calculate = (fn, x, y) => fn(x, y);
calculate(sum, 5, 17);
const makeAdder = function(constantValue) {
   return function adder(value) {
       return constantValue + value;
   };
}
const makeAdder = (constantValue) => 
                  (value) => constantValue + value;
const mul = (x, y) => x * y;
calculate(mul, 5, 17);

const sub = (x, y) => x - y;
calculate(sub, 5, 17);
sum x y = x + y
mul x y = x * y
calc fn a b  = fn a b


calc (sum 5 5)
calc (mul 5 5)

Function Composition

Композиция. Собираем функцию как конструктор: из маленьких подфункций.

let sum = (x, y) => x + y;
let sq = value => value * value;

let calc = (x, y) => sq(sum(x, y));
sq val = val * val
add5 x = x + 5
compose x = (sq << add5) x

main = text (toString (compose 5))
sq val = val * val
adder x y = x + y
compose x y = sq << adder x y

main =
  text (toString (compose 5 5))

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

      f(g(x))

1. x объявление​

2. g() передача x ​

3. f() передача в качестве аргумента результат выполнения g(x)

Первоклассные функции высшего порядка

1. Filter

2. Map

const byName = obj => obj.name;
students.map(byName);
// [ 'Anna', 'John', 'Maria' ]
let students = [
    {name: 'Anna', grade: 6},
    {name: 'John', grade: 4},
    {name: 'Maria', grade: 9}
];

const isApproved = student => student.grade >= 6;
students.filter(isApproved);
// [ { name: 'Anna', grade: 6 }, { name: 'Maria', grade: 9 } ]
let students = [
    {name: 'Anna', grade: 6},
    {name: 'John', grade: 4},
    {name: 'Maria', grade: 9}
];

const isApproved = student => student.grade >= 6;
const byName = obj => obj.name;
students.filter(isApproved).map(byName);
// ['Anna', 'Maria']
const totalGrades = students.reduce((sum, student) =>
                    sum + student.grade, 0);
totalGrades
// 19

3. Chaining

4. Reduce

Currying

Карирование

Такая функция принимает за 1 раз один аргумент

let add = x => y => x + y;
let sq = value => value * value;

let compose = (f, g) => f(g);
compose(sq, add(5)(5));
let add = x => y => x + y;
let sq = value => value * value;
let add5 = add(5);

let calc = sq(add5(6));
console.log(calc);
add x y =  x + y
add5 = add 5
square val = val * val

main =
  text (toString ((square << add5) 3)) 

Технологическая сингулярность

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

Thanks for attention!

Functional programming + Erl

By Elizabeth Anatskaya