ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ
Π€ΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ (Π€Π) - ΡΡΠΎ ΡΠ°ΠΊΠ°Ρ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ ΠΠΠ, ΠΏΠ°ΡΠ°Π΄ΠΈΠ³ΠΌΠ° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ. ΠΠ½Π° ΠΏΡΠ΅Π΄ΠΏΠΈΡΡΠ²Π°Π΅Ρ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ.
Π€Π Π½Π΅ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΎ ΠΏΠΎΠ²Π΅ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ - ΠΌΡ ΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠΌ ΠΊΠΎΠ΄ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ
Π Π°ΡΠΏΡΠΎΡΡΡΠ°Π½ΡΠ½Π½ΠΎΡΡΡ
ΠΡΡΡ ΡΠ·ΡΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π°Ρ ΠΎΠ΄ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠ°ΠΌΠΊΠ°Ρ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ°ΡΠ°Π΄ΠΈΠ³ΠΌΡ:
- ΠΠΠ
- Java
- C#
- Π€Π
- Haskell
- Lisp
- F#
ΠΠΎ ΡΠ°ΠΊ ΠΆΠ΅ Π΅ΡΡΡ ΠΈ ΠΌΡΠ»ΡΡΠΈΠΏΠ°ΡΠ°Π΄ΠΈΠ³ΠΌΠ΅Π½Π½ΡΠ΅ ΡΠ·ΡΠΊΠΈ, ΠΊΠ°ΠΊ JS
JS - ΡΡΠΎ ΠΌΡΠ»ΡΡΠΈΠΏΠ°ΡΠ°Π΄ΠΈΠ³ΠΌΠ΅Π½Π½ΡΠΉ Π―Π, ΠΊΠΎΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΊΠ°ΠΊ ΠΈΠΌΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΡΠΉ, ΡΠ°ΠΊ ΠΈ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΉ ΡΡΠΈΠ»ΠΈ.
ΠΠ°Π·ΠΎΠ²ΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΠΈ Π€Π
ΠΡΠΎΡΠ΅Π΄ΡΡΠ° - ΡΡΠΎ Π±Π»ΠΎΠΊ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Π½Π°Π±ΠΎΡ Π·Π°Π΄Π°Π½Π½ΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ.
Π€ΡΠ½ΠΊΡΠΈΡ - ΡΡΠΎ Π±Π»ΠΎΠΊ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ. ΠΠ±ΡΡΠ½ΠΎ, ΡΡΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΊΠ°ΠΊΠΈΡ -ΡΠΎ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ. ΠΠ½ΡΡΡΡ ΠΌΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΌ Π΄Π°Π½Π½ΡΠ΅ ΠΈ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½ΡΠΉ ΠΎΡ ΡΠ°Π·Π° ΠΊ ΡΠ°Π·Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ.
ΠΠ΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠ²Π½ΠΎΡΡΡ
ΠΡΡΡ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΠΎ Π΄Π²Π° ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π°:
- ΠΠΌΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΡΠΉ β ΠΠ°ΠΊ Ρ ΠΎΡΠΈΠΌ ΠΏΠΎΠ»ΡΡΠΈΡΡ? β ΠΠΏΠΈΡΡΠ²Π°Π΅ΠΌ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ
- ΠΠ΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠ²Π½ΡΠΉ β Π§ΡΠΎ Ρ ΠΎΡΠΈΠΌ ΠΏΠΎΠ»ΡΡΠΈΡΡ? β ΠΠΏΠΈΡΡΠ²Π°Π΅ΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ
Π ΠΎΡΠ½ΠΎΠ²Π΅ Π²ΡΠ΅Π³ΠΎ Π²ΡΠ΅Π³Π΄Π° ΡΡΠΎΠΈΡ ΠΈΠΌΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΡΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄, Π½Π° Π±Π°Π·Π΅ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠΎΠ·Π΄Π°ΡΡΡΡ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠ²Π½ΡΠ΅
ΠΠΌΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ
const arr = [1, 2, 3, 4, 5, 6];
function getEvens(arr) {
const evens = [];
for (let i = 0; i < arr.length; i++) {
if (arr[i] % 2 === 0) {
evens.push(arr[i]);
}
}
return evens;
}
console.log(getEvens(arr)); // [2, 4, 6]Π ΡΠΆΠ΅ ΠΏΠΎΠ²Π΅ΡΡ ΠΈΠΌΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡΡΠΎΠΈΡΡ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠ²Π½ΡΠ΅, Π² ΠΊΠΎΡΠΎΡΡΡ ΠΌΡ ΠΏΡΠΎΡΡΠΎ Π±ΡΠ΄Π΅ΠΌ ΠΎΠΏΠΈΡΡΠ²Π°ΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΊΠΎΠ΄
const arr = [1, 2, 3, 4, 5, 6];
const evens = getEvens(arr)
console.log(evens); // [2, 4, 6]ΠΠ΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠ²Π½ΠΎΡΡΡ - ΡΡΠΎ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ Π»ΡΠ±ΠΎΠ³ΠΎ Ρ ΠΎΡΠΎΡΠ΅Π³ΠΎ ΠΊΠΎΠ΄Π°. ΠΡΠΆΠ½ΠΎ ΡΡΡΠ΅ΠΌΠΈΡΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²ΡΠ²Π°ΡΡ ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΠΉ Π½Π°Π΄ Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΠΌΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΠΌΠΈ.
Π§ΠΈΡΡΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ
Π§ΠΈΡΡΠ°Ρ ΡΡΠ½ΠΊΡΠΈΡ β ΡΡΠΎ ΡΠ°ΠΊΠ°Ρ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΡΠ΅Π³Π΄Π° Π²Π΅Π΄Π΅Ρ ΡΠ΅Π±Ρ ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ΅ΠΌΠΎ ΠΈ Π½Π΅ Π²Π»ΠΈΡΠ΅Ρ Π½Π° Π²Π½Π΅ΡΠ½Π΅Π΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅.
ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΏΡΠΈΠ·Π½Π°ΠΊΠΈ ΡΠΈΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ:
- Π΄Π΅ΡΠ΅ΡΠΌΠΈΠ½ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΡΡΡ - ΠΏΡΠΈ ΠΎΠ΄Π½ΠΈΡ ΠΈ ΡΠ΅Ρ ΠΆΠ΅ Π²Ρ ΠΎΠ΄Π½ΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°Ρ Π²ΡΠ΅Π³Π΄Π° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡ ΠΆΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ
- ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ ΡΠ°ΠΉΠ΄-ΡΡΡΠ΅ΠΊΡΠΎΠ² - Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅Ρ Π²Π½Π΅ΡΠ½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅, Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ ΡΠ΅ΡΡΡ/ΡΠ°ΠΉΠ»Π°ΠΌΠΈ, Π½Π΅ ΠΏΠΈΡΠ΅Ρ Π² ΠΊΠΎΠ½ΡΠΎΠ»Ρ, Π½Π΅ Π²Π»ΠΈΡΠ΅Ρ Π½Π° ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π²Π½Π΅ ΡΠ°ΠΌΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ
- Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΈ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ Π²Π½Π΅ ΡΠ²ΠΎΠΈΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² - Π½Π΅ ΠΎΠΏΠΈΡΠ°Π΅ΡΡΡ Π½Π° Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅, Π½Π΅ ΠΌΡΡΠΈΡΡΠ΅Ρ ΠΈΡ
ΠΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΡΠΈ ΠΎΠ΄Π½ΠΈΡ ΠΈ ΡΠ΅Ρ ΠΆΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡΡ Π²ΡΠ΅Π³Π΄Π° Π±ΡΠ΄ΡΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ
function add(a, b) {
return a + b;
}
function multiplyBy2(arr) {
return arr.map(x => x * 2);
}
function isEven(n) {
return n % 2 === 0;
}Π ΡΠΆΠ΅ ΡΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ Π²Π½Π΅ΡΠ½Π΅Π³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΈ Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΈΡΡΠΎΠΉ
let counter = 0;
function increment() {
counter += 1;
return counter;
}ΠΠΌΠΌΡΡΠ°Π±Π΅Π»ΡΠ½ΠΎΡΡΡ
ΠΠΌΠΌΡΡΠ°Π±Π΅Π»ΡΠ½ΠΎΡΡΡΒ (Π½Π΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΡΡΡ) β ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ, ΡΠΎΠ³Π»Π°ΡΠ½ΠΎ ΠΊΠΎΡΠΎΡΠΎΠΉ Π΄Π°Π½Π½ΡΠ΅ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡΡΡ.
ΠΠΌΠ΅ΡΡΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ Π΅Π³ΠΎ Π½ΠΎΠ²Π°Ρ ΠΊΠΎΠΏΠΈΡ Ρ Π½ΡΠΆΠ½ΡΠΌΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡΠΌΠΈ.
ΠΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π° ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π°:
- ΠΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ΅ΠΌΠΎΡΡΡ -Β Π½Π΅Ρ ΡΠΊΡΡΡΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² Π΄ΡΡΠ³ΠΈΡ ΡΠ°ΡΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ
- Π£ΠΏΡΠΎΡΠ°Π΅Ρ ΠΎΡΠ»Π°Π΄ΠΊΡ ΠΈ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
- ΠΠ΅Π³ΡΠ΅ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΠΈΡΡΠΎΡΠΈΠ΅ΠΉ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, undo)
ΠΡΠΎΠ±Π»Π΅ΠΌΡ ΠΌΡΡΠ°Π±Π΅Π»ΡΠ½ΠΎΡΡΠΈ:
- Π΄Π°Π½Π½ΡΠ΅ Π±ΡΠ΄ΡΡ Π½Π΅ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΡΠΌΠΈ Π² ΡΠ°Π·Π½ΡΡ ΠΌΠ΅ΡΡΠ°Ρ ΠΊΠΎΠ΄Π°
- Π±ΡΠ΄ΡΡ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡΡ Π½Π΅ΡΠ²Π½ΡΠ΅ ΠΏΠΎΠ±ΠΎΡΠ½ΡΠ΅ ΡΡΡΠ΅ΠΊΡΡ
- ΡΡΠ»ΠΎΠΆΠ½ΠΈΡΡΡ Π΄Π΅Π±Π°Π³ ΠΈ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°
ΠΡΠΈΠΌΠ΅ΡΡ
ΠΡΠ»ΠΈ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΠΌΠ°ΡΡΠΈΠ² ΠΏΠΎ ΡΠ²ΠΎΠΈΠΌ ΠΊΡΠΈΡΠ΅ΡΠΈΡΠΌ, ΡΠΎ Π»ΡΡΡΠΈΠΌ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠΌ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ·Π΄Π°ΡΡ Π½ΠΎΠ²ΡΠΉ ΠΌΠ°ΡΡΠΈΠ²
const arr = [1, 2, 3];
const plusOne = arr.map(x => x + 1); // [2, 3, 4], arr Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΡΡΠΡΠ»ΠΈ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π² ΠΌΠ°ΡΡΠΈΠ², ΡΠΎ ΡΠ°ΠΊ ΠΆΠ΅ Π»ΡΡΡΠΈΠΌ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠΌ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ·Π΄Π°ΡΡ ΠΊΠΎΠΏΠΈΡ ΠΏΡΠΎΡΠ»ΠΎΠ³ΠΎ ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΠΆΠ΅ Π² Π½Π΅Π³ΠΎ Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅
const arr = [1, 2, 3];
arr.push(4); // arr ΡΠ΅ΠΏΠ΅ΡΡ [1, 2, 3, 4] β ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ² ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΡΡ!
const arr = [1, 2, 3];
const newArr = [...arr, 4]; // arr ΠΎΡΡΠ°Π»ΡΡ ΠΏΡΠ΅ΠΆΠ½ΠΈΠΌ, newArr β [1, 2, 3, 4]ΠΡΠΎΠ±Π»Π΅ΠΌΡ
Π JS ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΡΡΠ»ΠΊΠΈ Π½Π° ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΈ ΠΌΠ°ΡΡΠΈΠ²Ρ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΡΠΈ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠΈ ΠΊ Π½ΠΈΠΌ, ΠΌΡ Π²ΠΎΠ·Π΄Π΅ΠΉΡΡΠ²ΡΠ΅ΠΌ Ρ ΠΊΠΎΡΠ½Π΅Π²ΡΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ, Π° Π½Π΅ Ρ Π΅Π³ΠΎ ΠΊΠΎΠΏΠΈΠ΅ΠΉ
ΠΠΏΠ°ΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ:
sortsplice
ΠΡΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ:
toSorted, ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠ°ΡΡΠΉ ΠΌΠ°ΡΡΠΈΠ² ΠΈ ΡΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ[...arr].sortimmer/immutable js- map, filter, reduce
Π€ΡΠ½ΠΊΡΠΈΠΈ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° ΠΈ Π²ΡΡΡΠ΅Π³ΠΎ ΠΏΠΎΡΡΠ΄ΠΊΠ°
Π JS Π²ΡΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ: ΠΌΠ°ΡΡΠΈΠ²Ρ, ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈ ΡΠ°ΠΌΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΡ. ΠΡΠΈΠΌΠΈΡΠΈΠ²Π½ΡΠ΅ ΡΠΈΠΏΡ Π΄Π°Π½Π½ΡΡ ΠΈΠΌΠ΅ΡΡ Π²ΡΠ°ΠΏΠΏΠ΅Ρ-ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΌΠ΅ΡΠΎΠ΄Π°ΠΌ ΡΠ²ΡΠ·Π°Π½Π½ΡΠΌ Ρ ΡΡΠΈΠΌ ΡΠΈΠΏΠΎΠΌ Π΄Π°Π½Π½ΡΡ .
ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ:
- ΠΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°ΠΌΠΈ Π² ΡΡΠ½ΠΊΡΠΈΡ
- ΠΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ Π΄ΡΡΠ³ΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΈΠ· ΡΡΠ½ΠΊΡΠΈΠΈ
- ΠΡΠΈΡΠ²ΠΎΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΡ Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ, ΠΊΠ°ΠΊ ΠΎΠ±ΡΡΠ½ΡΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ, Π½ΠΎ Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΡ Π²ΡΠ·ΡΠ²Π°ΡΡ Π΅Π³ΠΎ.
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ, ΡΡΠΎ ΠΊΠΎΠ³Π΄Π° ΠΌΡ ΡΠ°Π±ΠΎΡΠ°Π΅ΠΌ Ρ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΠΎ ΠΎΠ½ΠΈ Π±ΡΠ΄ΡΡ ΡΠ²Π»ΡΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°
Π€ΡΠ½ΠΊΡΠΈΠΈ Π²ΡΡΡΠ΅Π³ΠΎ ΠΏΠΎΡΡΠ΄ΠΊΠ° - ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ:
- ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΠΈΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ
- Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ Π΄ΡΡΠ³ΡΡ ΡΡΠ½ΠΊΡΠΈΡ
ΠΡΠΈΠΌΠ΅ΡΡ:
map,reduce,filter, Π·Π°ΠΌΡΠΊΠ°Π½ΠΈΡ, ΠΌΠ΅ΠΌΠΎΠΈΠ·Π°ΡΠΈΡ, debounce/throttle
Π§Π°ΡΡΠ½ΡΠ΅ ΡΠ»ΡΡΠ°ΠΈ
ΠΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ
ΠΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ β ΡΡΠΎ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΊ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ Π΄ΡΡΠ³ΠΎΠΉ, Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΡΠ΅Π³ΠΎ ΡΠΎΠ·Π΄Π°ΡΡΡΡ Π½ΠΎΠ²Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ
ΠΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΈΡ Π½Π°ΠΌ Π½ΡΠΆΠ½Ρ Π΄Π»Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠ°Π½ΠΈΡ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠ²Π½ΠΎΡΡΠΈ ΡΠΈΡΡΠ΅ΠΌΡ
Π ΠΎΠ±ΡΡΠ½ΠΎΠΉ ΠΆΠΈΠ·Π½ΠΈ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ Π΄Π΅ΡΠΎΠ»ΡΠ½ΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ Π΄ΡΡΠ³ Π·Π° Π΄ΡΡΠ³ΠΎΠΌ
fn1(fn2(fn3(fn4('hello'))));ΠΠΎ ΡΠ°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ Π±ΡΠ΄Π΅Ρ ΠΊΡΠ°ΠΉΠ½Π΅ Π½Π΅ΡΠ΄ΠΎΠ±Π½ΡΠΌ.
ΠΠ»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΡΠΎ ΡΠΊΡΡΡΠΈΠ΅ΠΌ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ, ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΡ compose, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ
// ΡΡΠ½ΠΊΡΠΈΡ-ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΎΡ
const compose = (...funcs) => (initialValue) =>
funcs.reduceRight((acc, fn) => fn(acc), initialValue);
// ΠΏΡΠΈΠΌΠ΅Ρ
const upperCase = str => str.toUpperCase();
const exclaim = str => str + '!';
const repeat = str => `${str} `.repeat(2);
const getResult = compose(repeat, exclaim, upperCase);
console.log(getResult('hello')); // HELLO! HELLO! Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π² Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡΠ°Ρ
ΠΠΎΠ½Π²Π΅ΠΉΠ΅Ρ
Π€ΡΠ½ΠΊΡΠΈΡ-ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ (pipe) β ΡΡΠΎ Π°Π½Π°Π»ΠΎΠ³ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΈΠΈ, Π½ΠΎ ΠΎΠ½Π° Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ»Π΅Π²Π° Π½Π°ΠΏΡΠ°Π²ΠΎ: ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ Π²ΡΠΎΡΠΎΠΉ, ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠΎΡΠΎΠΉ Π² ΡΡΠ΅ΡΡΡ ΠΈ ΡΠ°ΠΊ Π΄Π°Π»Π΅Π΅.
const pipe =
(...functions) =>
(x) => functions.reduce((value, func) => func(value), x);ΠΠ΅ΡΠ΅Π΄Π°Π½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π±ΡΠ΄ΡΡ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ
const double = x => x * 2;
const increment = x => x + 1;
const square = x => x * x;
const getResult = pipe(double, increment, square);
console.log(getResult(3)); // ((3 * 2) + 1) ^ 2 = 49Π§Π°ΡΡΠΈΡΠ½ΠΎΠ΅ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅
Π§Π°ΡΡΠΈΡΠ½ΠΎΠ΅ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ β ΡΡΠΎ ΡΠ΅Ρ Π½ΠΈΠΊΠ°, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠ°Ρ ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°ΡΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π½ΠΎΠ²ΡΡ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ ΠΎΡΡΠ°Π²ΡΠΈΠ΅ΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ.
Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ Π½Π°ΠΌ Π½Π΅ ΠΈΡΠΊΠ°ΡΡ, Π½Π΅ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈ Π½Π΅ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΡΠ²Π°ΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ Π·Π°Π½ΠΎΠ²ΠΎ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²ΡΠ·ΠΎΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ. Π’ΡΡ ΠΌΡ ΡΠΊΡΡΠ²Π°Π΅ΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΡ ΡΠ°ΡΡΡ ΠΏΠΎΠ²ΡΠΎΡΡΠ΅ΠΌΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ²
ΠΡΡ ΠΎΠ΄Π½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ
const userHasRole = (user, role) => user.roles.includes(role);
const operator = { name: 'ΠΠ½Π½Π°', roles: ['USER', 'ADMIN'] };
userHasRole(operator, 'ADMIN'); // trueΠ€ΠΈΠΊΡΠΈΡΡΠ΅ΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ
const clientHasRole = role => userHasRole(operator, role);
clientHasRole('ADMIN'); // true
clientHasRole('USER'); // true
clientHasRole('MANAGER'); // falseΠΠΎ ΡΠ°ΠΊ ΠΆΠ΅ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°ΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ ΡΠ΅ΡΠ΅Π· bind, ΡΡΠΎ ΡΠ²Π»ΡΠ΅ΡΡΡ Π±ΠΎΠ»Π΅Π΅ Π½Π°ΡΠΈΠ²Π½ΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ
const clientHasRole = userHasRole.bind(null, operator);
console.log(clientHasRole('ADMIN')); // true
console.log(clientHasRole('USER')); // true
console.log(clientHasRole('MANAGER')); // falseΠ€ΠΈΠΊΡΠΈΡΡΠ΅ΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈ ΡΠΎΠ»Ρ
const isClientAdmin = () => clientHasRole('ADMIN');
isClientAdmin(); // trueΠ ΠΈΡΠΎΠ³Π΅, ΠΌΡ ΡΠΎΠΊΡΠ°ΡΠΈΠ»ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Ρ Π΄Π²ΡΡ Π΄ΠΎ Π½ΡΠ»Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ²
userHasRole(operator, 'ADMIN');
// >
clientHasRole('ADMIN');
// >
isClientAdmin();ΠΠ°ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
ΠΠ°ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅Β β ΡΡΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°ΠΌΠΈ Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ, ΠΊΠ°ΠΆΠ΄Π°Ρ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΠ²ΠΎΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ
const userHasRoleCurried = user => role => user.roles.includes(role);const operator = { name: 'ΠΠ½Π½Π°', roles: ['USER', 'ADMIN'] };
const clientHasRole = userHasRoleCurried(operator);
console.log(clientHasRole('ADMIN')); // true
console.log(clientHasRole('MANAGER')); // falseΠΠ°ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ³ΠΎΠ΄ΠΈΡΡΡΡ, ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΠΏΠΎΡΡΡΠΏΠΈΠ²ΡΠΈΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ ΠΈΡ Π² ΡΠ»Π΅Π΄ΡΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ. ΠΡΠΎ ΡΠ°ΠΊ ΠΆΠ΅ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ ΡΠΎΡ ΡΠ°Π½ΡΡΡ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠ²Π½ΠΎΡΡΡ ΠΊΠΎΠ΄Π° Π·Π° ΡΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ
ΠΠ²ΡΠΎΠΊΠ°ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
Π’Π°ΠΊ ΠΆΠ΅ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ΄Π΅Ρ ΡΠ°ΠΌΠ° ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²ΡΠ²Π°ΡΡ ΠΊΠ°ΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ
function curry(fn) {
return function curried(...args) {
// ΠΡΠ»ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π½ΠΎ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² β Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ
if (args.length >= fn.length) {
return fn.apply(this, args);
} else {
// ΠΠ½Π°ΡΠ΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ, ΠΎΠΆΠΈΠ΄Π°ΡΡΡΡ ΠΎΡΡΠ°Π²ΡΠΈΠ΅ΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ
return function (...nextArgs) {
return curried.apply(this, args.concat(nextArgs));
};
}
};
}Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΊΠ°ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Ρ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ-ΠΎΠ±ΡΡΡΠΊΠΎΠΉ
const curriedUserHasRole = curry(userHasRole);
const operator = { name: 'ΠΠ½Π½Π°', roles: ['USER', 'ADMIN'] };
const clientHasRole = curriedUserHasRole(operator);
console.log(clientHasRole('ADMIN')); // true
console.log(clientHasRole('MANAGER')); // false
// ΠΈΠ»ΠΈ ΡΠ°ΠΊ:
console.log(curriedUserHasRole(operator, 'USER')); // trueChaining
ChainingΒ β ΡΡΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΠ΅ Π²ΡΠ·ΠΎΠ²Ρ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΠΎΠ±ΡΠ΅ΠΊΡΠ° (ΡΠ΅ΠΏΠΎΡΠΊΠ° Π²ΡΠ·ΠΎΠ²ΠΎΠ²), ΠΏΡΠΈ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠΉ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΡ ΡΠ΅ΠΏΠΎΡΠΊΡ
const result = new Array(10)
.fill(1) // [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
.map((x, i) => x + i) // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
.filter(x => x % 2 === 0) // [2, 4, 6, 8, 10]
.join(', '); // "2, 4, 6, 8, 10"
console.log(result); // "2, 4, 6, 8, 10"fetch('https://jsonplaceholder.typicode.com/users/1')
.then(response => response.json())
.then(data => data.name)
.then(name => name.toUpperCase())
.then(console.log) // Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ: "LEANNE GRAHAM"
.catch(console.error);Π ΡΠ°ΠΊΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, ΡΡΠ½ΠΊΡΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΊΠ°ΠΆΠ΄ΡΠΉ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ this ΠΈΠ»ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΡ ΡΠ΅ΠΉΠ½
ΠΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ
ΠΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΒ β ΡΡΠΎ ΠΎΠ±ΡΠ΅ΠΊΡ-ΠΎΠ±ΡΡΡΠΊΠ°, ΠΊΠΎΡΠΎΡΡΠΉ βΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρβ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎ ΠΈ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠ²Π½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π½ΠΈΠΌ ΡΠ΅ΡΠ΅Π· ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, map, flatMap)
class Box<T> {
// ΠΡΠΈΠ²Π°ΡΠ½ΠΎΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ Ρ ΡΠΈΠΏΠΎΠΌ T
private value: T;
// ΠΡΠΈΠ²Π°ΡΠ½ΡΠΉ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ
private constructor(value: T) {
this.value = value;
}
// Π‘ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΠ°Π±ΡΠΈΡΠ½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄
static of<T>(value: T): Box<T> {
return new Box(value);
}
// map Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½ΠΈΠ΅ΠΌ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°
map<U>(fn: (x: T) => U): Box<U> {
return Box.of(fn(this.value));
}
// fold Π΄Π»Ρ ΡΠ°ΡΠΊΡΡΡΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ
fold<U>(fn: (x: T) => U): U {
return fn(this.value);
}
}
// ΠΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ:
const result = Box
.of(10)
.map(x => x + 5)
.map(x => x * 2)
.fold(x => `Π Π΅Π·ΡΠ»ΡΡΠ°Ρ: ${x}`);
console.log(result); // 'Π Π΅Π·ΡΠ»ΡΡΠ°Ρ: 30'ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΠΌ ΡΠ΄Π΅Π»Π°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈΠΌΠΌΡΡΠ°Π±Π΅Π»ΡΠ½ΡΠΌ ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ Π΅Π³ΠΎ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠ²Π½ΠΎ ΡΠ΅ΡΠ΅Π· Π΄ΠΎΡΡΡΠΏΠ½ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ.
Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΠΌ ΡΠ°ΠΊ ΠΆΠ΅ ΠΈ ΡΠ΅ΡΠ΅Π· ΠΏΡΠΎΡΠΎΡΠΈΠΏΡ, Π½ΠΎ ΠΏΡΠΎΡΠ΅ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ΅ΡΠ΅Π· ΠΊΠ»Π°ΡΡΡ.
Π’Π°ΠΊ ΠΆΠ΅ ΠΌΡ ΠΈΠ·Π±Π°Π²Π»ΡΠ΅ΠΌΡΡ ΠΎΡ Π»ΡΠΊΠΎΠ²ΠΈΡΡ Π²ΡΠ·ΠΎΠ²ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΉ fn1(fn2(fn3(val)))
Π€ΡΠ½ΠΊΡΠΎΡΡ
Π€ΡΠ½ΠΊΡΠΎΡΒ β ΡΡΠΎ ΡΡΡΡΠΊΡΡΡΠ°-ΠΎΠ±ΡΡΡΠΊΠ°, Ρ ΠΊΠΎΡΠΎΡΠΎΠΉ Π΅ΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Β map(fn), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠΉ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΊ Ρ
ΡΠ°Π½ΠΈΠΌΠΎΠΌΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π½ΠΎΠ²ΡΡ ΠΎΠ±ΡΡΡΠΊΡ ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΆΠ΅ ΡΠΈΠΏΠ°.
// Π€ΡΠ½ΠΊΡΠΎΡ: map Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½ΠΎΠ²ΡΠΉ Box Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠΌ fn(value)
const result = Box.of(2).map(x => x + 3).map(x => x * 10); // Box(50)Π€ΡΠ½ΠΊΡΠΎΡ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ ΡΠΎΡ
ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΡΡΡΡΠΊΡΡΡΡ ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎ βΡΡΠ°Π½ΡΠ»ΠΈΡΠΎΠ²Π°ΡΡβ Π²Π½ΡΡΡΠΈ Π½Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡΒ map, ΡΡΠΎ ΠΎΠ±ΡΡΠ½ΠΎ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ: Π·Π°ΠΊΠΎΠ½ΠΎΠΌ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΈΠΈ ΠΈ Π·Π°ΠΊΠΎΠ½ΠΎΠΌ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΠΎΡΡΠΈ.
Π€ΡΠ½ΠΊΡΠΎΡΠ°ΠΌΠΈ Π² JS ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π·Π²Π°ΡΡ:
- Array
- Promise
ΠΠΏΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΎΡΡ
ΠΠΏΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΡΠΉ ΡΡΠ½ΠΊΡΠΎΡΒ β ΡΠ°ΡΡΠΈΡΡΠ΅Ρ ΠΈΠ΄Π΅Ρ ΡΡΠ½ΠΊΡΠΎΡΠ°: Π² Π½ΡΠΌ ΠΌΠΎΠΆΠ½ΠΎ Ρ
ΡΠ°Π½ΠΈΡΡ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, Π½ΠΎ ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ ΠΈΡ
ΠΊ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌ Π²Π½ΡΡΡΠΈ Π΄ΡΡΠ³ΠΈΡ
ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ² Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Π° Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅Β apΒ (apply).
class Box<T> {
// ...
ap<U>(b: Box<(x: T) => U>): Box<U> {
return b.map(fn => fn(this.value));
}
}
// 1 - box ΠΎΡ value
const valueBox = Box.of(5);
// box ΠΎΡ func
const fnBox = Box.of((n: number) => n * 3);
// ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΡ
const result2 = valueBox.ap(fnBox); // Box(15)ΠΡΠ»ΠΈ map ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ, ΡΠΎ ap ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°ΠΌΠΈ
ΠΠΎΠ½Π°Π΄Ρ
ΠΠΎΠ½Π°Π΄Π°Β β ΡΡΠΎ ΡΡΡΡΠΊΡΡΡΠ°, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ Π΅ΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Β flatMapΒ (ΠΈΠ»ΠΈΒ chain, ΠΈΠ½ΠΎΠ³Π΄Π° Π½Π°Π·ΡΠ²Π°ΡΡΒ bind): ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ½ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ βΡΠ°Π·Π²ΠΎΡΠ°ΡΠΈΠ²Π°ΡΡβ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ. Π’ΠΎ Π΅ΡΡΡ Π²Π½ΡΡΡΠΈΒ mapΒ ΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ Π½Π΅ ΠΏΡΠΎΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, Π° ΡΠ΅Π»ΡΠΉ Π½ΠΎΠ²ΡΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ - ΠΈ ΡΡΠΎΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Π½Π΅ Π±ΡΠ΄Π΅Ρ Π²ΠΊΠ»Π°Π΄ΡΠ²Π°ΡΡΡΡ Π΄ΡΡΠ³ Π² Π΄ΡΡΠ³Π° Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, Π° Π°ΠΊΠΊΡΡΠ°ΡΠ½ΠΎ ΡΠ²ΡΡΠ½ΡΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ Π² ΠΎΠ΄ΠΈΠ½ ΡΠ»ΠΎΠΉ.
class Box<T> {
// ..
flatMap<U>(fn: (x: T) => Box<U>): Box<U> {
return fn(this.value);
}
}
const result3 = Box.of(8)
.flatMap(x => Box.of(x * 2)) // Box(16)
.flatMap(x => Box.of(`box:${x}`)); // Box('box:16')- ΠΡΠ½ΠΎΠ²Π½ΠΎΠ΅ ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡΒ
map: Π²Π½ΡΡΡΠΈΒflatMapΒ ΡΡΠ½ΠΊΡΠΈΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΆΠ΅ Box, Π° Π½Π΅ ΠΏΡΠΎΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΈ ΠΎΠ±ΡΡΡΡΠ²Π°Π½ΠΈΠ΅ Π½Π΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ. - ΠΠΎΠ½Π°Π΄Ρ ΠΎΡΠ΅Π½Ρ ΡΠ΄ΠΎΠ±Π½Ρ Π΄Π»Ρ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ βΡΠ΅ΠΏΠΎΡΠ΅ΠΊβ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΡ , ΠΏΠΎΠ±ΠΎΡΠ½ΡΡ ΠΈΠ»ΠΈ ΡΡΠ»ΠΎΠ²Π½ΡΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ Π±Π΅Π· Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΡ ΡΡΡΡΠΊΡΡΡ.
Π€ΡΠ½ΠΊΡΠΎΡΡ - ΡΡΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΡΡΠ½ΠΊΡΠΈΠΈ, Π° ΠΌΠΎΠ½Π°Π΄Ρ - ΡΡΠΎ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° ΡΡΠ½ΠΊΡΠΎΡΠΎΠ²
Π‘ΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ Fantasy Land
Fantasy LandΒ β ΡΡΠΎ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ Π΄Π»Ρ Π°Π»Π³Π΅Π±ΡΠ°ΠΈΡΠ΅ΡΠΊΠΈΡ ΡΡΡΡΠΊΡΡΡ Π² JS, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΠΏΠΈΡΡΠ²Π°Π΅Ρ Π½Π°Π±ΠΎΡ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΠΉ ΠΈ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΊ Π½ΠΈΠΌ, ΡΡΠΎΠ±Ρ ΡΠ°Π·Π½ΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΌΠΎΠ³Π»ΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ.
ΠΠΎΡ ΠΊΡΠ°ΡΠΊΠΈΠΉ ΡΠΏΠΈΡΠΎΠΊ ΠΎΡΠ½ΠΎΠ²Π½ΡΡ ΡΡΡΠ½ΠΎΡΡΠ΅ΠΉ Fantasy Land ΠΈ ΠΈΡ ΠΊΠ»ΡΡΠ΅Π²ΡΠ΅ ΠΈΠ΄Π΅ΠΈ:
- Setoid
- equals (fantasy-land/equals): ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½ΠΎΡΡΡ; Π·Π°ΠΊΠΎΠ½Ρ ΡΠ΅ΡΠ»Π΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ, ΡΠΈΠΌΠΌΠ΅ΡΡΠΈΠΈ, ΡΡΠ°Π½Π·ΠΈΡΠΈΠ²Π½ΠΎΡΡΠΈ.
- Ord (ΡΡΠ΅Π±ΡΠ΅Ρ Setoid)
- lte (fantasy-land/lte): ΡΠΎΡΠ°Π»ΡΠ½ΡΠΉ ΠΏΠΎΡΡΠ΄ΠΎΠΊ; Π°Π½ΡΠΈΡΠΈΠΌΠΌΠ΅ΡΡΠΈΡ, ΡΡΠ°Π½Π·ΠΈΡΠΈΠ²Π½ΠΎΡΡΡ.
- Semigroup
- concat (fantasy-land/concat): Π°ΡΡΠΎΡΠΈΠ°ΡΠΈΠ²Π½ΠΎΠ΅ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°.
- Monoid (ΡΡΠ΅Π±ΡΠ΅Ρ Semigroup)
- empty (fantasy-land/empty): Π½Π΅ΠΉΡΡΠ°Π»ΡΠ½ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ; Π»Π΅Π²ΡΠ΅/ΠΏΡΠ°Π²ΡΠ΅ Π΅Π΄ΠΈΠ½ΠΈΡΡ.
- Group (ΡΡΠ΅Π±ΡΠ΅Ρ Monoid)
- invert (fantasy-land/invert): ΠΎΠ±ΡΠ°ΡΠ½ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ; Π»Π΅Π²ΡΠ΅/ΠΏΡΠ°Π²ΡΠ΅ ΠΈΠ½Π²Π΅ΡΡΠΈΠΈ.
- Semigroupoid
- compose (fantasy-land/compose): Π°ΡΡΠΎΡΠΈΠ°ΡΠΈΠ²Π½Π°Ρ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΌΠΎΡΡΠΈΠ·ΠΌΠΎΠ².
- Category (ΡΡΠ΅Π±ΡΠ΅Ρ Semigroupoid)
- id (fantasy-land/id): ΡΠΎΠΆΠ΄Π΅ΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΌΠΎΡΡΠΈΠ·ΠΌ; Π»Π΅Π²ΡΠ΅/ΠΏΡΠ°Π²ΡΠ΅ Π΅Π΄ΠΈΠ½ΠΈΡΡ.
- Functor
- map (fantasy-land/map): ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΡΠΎΠ±Π»ΡΠ΄Π°Ρ identity ΠΈ composition.
- Apply (ΡΡΠ΅Π±ΡΠ΅Ρ Functor)
- ap (fantasy-land/ap): ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π²Π½ΡΡΡΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° ΠΊ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅; ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΈΠΎΠ½Π½ΡΠΉ Π·Π°ΠΊΠΎΠ½.
- Applicative (ΡΡΠ΅Π±ΡΠ΅Ρ Apply)
- of (fantasy-land/of): ΠΏΠΎΠ΄ΡΡΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ; Π·Π°ΠΊΠΎΠ½Ρ identity, homomorphism, interchange.
- Chain (ΡΡΠ΅Π±ΡΠ΅Ρ Apply)
- chain (fantasy-land/chain): ΠΌΠΎΠ½Π°Π΄ΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΠ²ΡΠ·ΠΊΠ°; Π°ΡΡΠΎΡΠΈΠ°ΡΠΈΠ²Π½ΠΎΡΡΡ.
- ChainRec (ΡΡΠ΅Π±ΡΠ΅Ρ Chain)
- chainRec (fantasy-land/chainRec): ΡΡΠ΅ΠΊ-Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½Π°Ρ ΡΠ΅ΠΊΡΡΡΠΈΡ Π² ΡΠ΅ΡΠΌΠΈΠ½Π°Ρ Chain.
- Monad (ΡΡΠ΅Π±ΡΠ΅Ρ Applicative ΠΈ Chain)
- of (fantasy-land/of): ΠΊΠ°ΠΊ Π² Applicative.
- chain (fantasy-land/chain): Π·Π°ΠΊΠΎΠ½Ρ Π»Π΅Π²ΠΎΠΉ/ΠΏΡΠ°Π²ΠΎΠΉ Π΅Π΄ΠΈΠ½ΠΈΡΡ.
- Foldable
- reduce (fantasy-land/reduce): ΡΠ²ΡΡΡΠΊΠ° ΡΡΡΡΠΊΡΡΡΡ; ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½ΠΎΡΡΡ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ ΡΠ²ΡΡΡΠΊΠ΅.
- Traversable (ΡΡΠ΅Π±ΡΠ΅Ρ Functor ΠΈ Foldable)
- traverse (fantasy-land/traverse): ΠΏΡΠΎΡ ΠΎΠ΄ ΡΠΎ ΡΠ±ΠΎΡΠΊΠΎΠΉ ΡΡΡΠ΅ΠΊΡΠΎΠ²; naturality, identity, composition.
- Contravariant
- contramap (fantasy-land/contramap): ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π²Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°; Π·Π°ΠΊΠΎΠ½Ρ identity ΠΈ composition.
- Bifunctor (ΡΡΠ΅Π±ΡΠ΅Ρ Functor)
- bimap (fantasy-land/bimap): ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎ Π΄Π²ΡΠΌ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΡΠΌ; identity ΠΈ composition.
- Profunctor (ΡΡΠ΅Π±ΡΠ΅Ρ Functor)
- promap (fantasy-land/promap): ΠΊΠΎΠ½ΡΡΠ°-/ΠΊΠΎΠ²Π°ΡΠΈΠ°Π½ΡΠ½ΠΎΠ΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π²Ρ ΠΎΠ΄Π°/Π²ΡΡ ΠΎΠ΄Π°; identity ΠΈ composition.
- Alt (ΡΡΠ΅Π±ΡΠ΅Ρ Functor)
- alt (fantasy-land/alt): Π°ΡΡΠΎΡΠΈΠ°ΡΠΈΠ²Π½Π°Ρ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π°; Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΠ²Π½ΠΎΡΡΡ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ map.
- Plus (ΡΡΠ΅Π±ΡΠ΅Ρ Alt)
- zero (fantasy-land/zero): Π½Π΅ΠΉΡΡΠ°Π»ΡΠ½ΡΠΉ Β«ΠΏΡΡΡΠΎΠΉΒ» ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π΄Π»Ρ alt; Π·Π°ΠΊΠΎΠ½Ρ left/right identity ΠΈ annihilation.
- Alternative (ΡΡΠ΅Π±ΡΠ΅Ρ Applicative ΠΈ Plus)
- alt (fantasy-land/alt)
- zero (fantasy-land/zero)
- of (fantasy-land/of): Π·Π°ΠΊΠΎΠ½Ρ Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΠ²Π½ΠΎΡΡΠΈ ΠΈ ΡΠ½ΠΈΡΡΠΎΠΆΠ΅Π½ΠΈΡ Π΄Π»Ρ ap Ρ zero.
- Extend (ΡΡΠ΅Π±ΡΠ΅Ρ Functor)
- extend (fantasy-land/extend): ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈΠ· ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°; Π·Π°ΠΊΠΎΠ½ ΠΊΠ²Π°Π·ΠΈΠΌΠΎΠ½Π°Π΄Π½ΠΎΠΉ Π°ΡΡΠΎΡΠΈΠ°ΡΠΈΠ²Π½ΠΎΡΡΠΈ.
- Comonad (ΡΡΠ΅Π±ΡΠ΅Ρ Extend)
- extract (fantasy-land/extract): ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ; Π»Π΅Π²ΡΠ΅/ΠΏΡΠ°Π²ΡΠ΅ Π΅Π΄ΠΈΠ½ΠΈΡΡ Π΄Π»Ρ extend/extract.
ΠΡΠΎΠ³ΠΈ
- ΠΠ΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠ²Π½ΠΎΡΡΡ, ΡΠΈΡΡΠΎΡΠ° ΡΡΠ½ΠΊΡΠΈΠΉ, ΠΈΠΌΠΌΡΡΠ°Π±Π΅Π»ΡΠ½ΠΎΡΡΡ ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΡΡΡΠ΅Π³ΠΎ ΠΏΠΎΡΡΠ΄ΠΊΠ° β ΠΎΡΠ½ΠΎΠ²Π° Π³ΠΈΠ±ΠΊΠΎΡΡΠΈ Π€Π.
- Π JS Π΄ΠΎΡΡΡΠΏΠ½Ρ ΠΈ Π±Π°Π·ΠΎΠ²ΡΠ΅, ΠΈ ΠΏΡΠΎΠ΄Π²ΠΈΠ½ΡΡΡΠ΅ Π€Π-ΠΏΡΠ°ΠΊΡΠΈΠΊΠΈ.