Кремниевая долина в 1936 году.
Кремниевая долина наши дни.
— насыщенное интернет-приложение. Это веб-приложение, загружаемое пользователем через интернет, предназначенное для выполнения функций традиционных настольных приложений и работающее на устройстве пользователя (не на сервере).
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
NO REVERSE?! HOW THE HELL AM I SUPPOSED TO DRIVE WITHOUT REVERSE?!
WHAAT?!
Многие вещи, к которым мы привыкли в обычном программировании не справедливы для функционального
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);
Цель: минимизировать влияние нечистых функций и ограничить их от остальной части программы.
Нельзя изменять переменную после её инициализации. Можно лишь создавать новые, но не изменять существующие. Нет никаких переменных!
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
При необходимости изменения значения переменной или объекта
let x = 1;
let y = x + 1;
При реализации циклов
— делаем копию.
Никаких циклов с конструкциями for, while, do, repeat
let acc = 0;
for (let i = 1; i <= 10; ++i)
acc += i;
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
Рекурсия - всему голова. Ну, или хвост. Там как пойдёт..
Иммутабельность (неизменность, постоянство) —
это защита от самого себя.
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)
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
Такая функция принимает за 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))
Технологическая сингулярность
Гипотетический момент, по прошествии которого, по мнению сторонников данной концепции, технический прогресс станет настолько быстрым и сложным, что окажется недоступным пониманию.