Ievads
Bieži vien ir grūti uzturēt nemodificējamu. Ietīšanas modelis dati konteinerā nāk palīgā. Tas nodrošina vērtības tā, lai darbs ar tām būtu drošs un nerastos blakusparādības.
Ja esat šeit jauns, pārliecinieties, ka pārbaudījāt manas pēdējās 2 daļas par funkcionālo programmēšanu par The Codest blogs par:
Funktors
Tam nav sarežģītas loģikas. Tās galvenais uzdevums ir ietīt kontekstu un veikt funkcijas, ko tā saņem no ārpuses. Katru reizi, kad mainās vērtība, tiek pārpakots un atdots jauns konteinera gadījums. Izsaucot karte metode, kas veic konkrētu darbību, tā atgriež jaunu konteinera gadījumu ar vērtību, ko atdod nodotā funkcija, vienlaikus saglabājot nemodificēšanas principu.
Deklarācija
const Functor = value => ({ {
map: fn => Functor(fn(value)),
chain: fn => fn(value),
of: () => value
});
karte - noderēs, ja vēlaties mainīt konteinera vērtības stāvokli, bet vēl nevēlaties to atgriezt.
ķēde - izmanto, ja vēlaties nodot vērtību funkcijai, nemainot konteinera stāvokli. Parasti beigās karte zvani.
no - atgriezt pašreizējo vērtību
Imperatīvais piemērs
const randomInt = (max) => Math.floor(Math.random() * (max + 1))
const randomNumber = randomInt(200) // atgriež skaitli no 0 līdz 200
reduce(randomNumber) // atgriež (skaitli no 0 līdz 200) - 1
Deklaratīvs piemērs
const randomIntWrapper = (max) =>
Functor(max)
.map(increase) // max + 1
.map(multiplyBy(Math.random())) // Math.random() * (max + 1)
.map(Math.floor) // Math.floor(Math.random() * (max + 1))
const randomNumber = randomIntWrapper(200)
randomNumber.of() // atgriež skaitli no 0 līdz 200
randomNumber.chain(reduce) // atgriež (skaitli no 0 līdz 200) - 1
Monādes
Dažreiz papildus funkcijām, kas izraisa vērtības jauno stāvokli, ir nepieciešama papildu loģika, kas ir paslēpta konteinerā. Šajā gadījumā noder monada, jo tā ir paplašinājums funktors. Tā var, piemēram, izlemt, kas notiks, ja vērtībai būs noteikta vērtība, vai kāds ceļš jāizvēlas nākamajām darbībām.
Monādes varbūt
Monādes varbūt atrisina problēmu ar vērtībām, kas neatgriež true. Ja tā notiek, turpmākie karte izsaukumi tiek ignorēti, bet tas ļauj atgriezt alternatīvu, izsaucot getOr metode. Tas ļauj izvairīties no if / else operatoru izmantošanas, kas ir populāri metodēs. imperatīvs programmēšana. Šī monāde sastāv no trim konteineriem:
Nekas - darbojas, kad konteinerā iekrīt vērtība, kas nav true, vai filtrs metode atgriež false. To izmanto, lai simulētu funkcijas izpildi. Tas nozīmē, ka šis konteiners saņem funkciju, bet neizpilda to.
Tikai - tas ir galvenais konteiners, kas veic visas funkcijas, bet, ja vērtība mainās uz nepatiesu vērtību vai filtrs metode atgriež false, tā to nodos vienumam Nekas konteiners.
Varbūt - Es ņemu sākotnējo vērtību un izlemju, kādu konteineru izsaukt sākumā.
Deklarācija
const Just = vērtība => ({
map: fn => Maybe(fn(value)),
chain: fn => fn(value),
of: () => value,
getOr: () => value,
filter: fn => fn(value) ? Just(value) : Nekas(),
type: 'just'
});
const Nothing = () => ({
map: fn => Nothing(),
chain: fn => fn(),
of: () => Nothing(),
getOr: substitute => substitute,
filter: () => Nothing(),
type: "nothing
});
const Maybe = value =>
value === null || value === undefined || value.type === 'nothing'
? nekas()
: Just(value)

Tagad izveidosim iepriekšējo piemēru par nosacījumu. Ja max ir lielāks par nulli, funkcija tiks izpildīta. Pretējā gadījumā tā atgriezīs 0.
Imperatīvais piemērs
const randomInt = (max) => {
if(max > 0) {
return Math.floor(Math.random() * (max + 1))
} citādi {
return 0
}
}
const bookMiddlePage = 200
const randomPage = randomInt(10) || bookMiddlePage // atgriež nejaušības principu
const randomPage = randomInt(-10) || bookMiddlePage // atgriež 200
Deklaratīvs piemērs
const randomIntWrapper = (max) =>
Maybe(max)
.filter(max => max > 0) // vērtība false ignorē turpmākos izsaukumus
.map(palielināt)
.map(multiplyBy(Math.random()))
.map(Math.floor)
const bookMiddlePage = 200
// Tikai konteiners
const randomPage = randomIntWrapper(10).getOr(bookMiddlePage) // atgriež nejaušo lapu
// Nekas konteiners
const randomPage = randomIntWrapper(-10).getOr(bookMiddlePage) // atgriež 200
