Greitas įvadas į „pipe“ () ir komponavimą () „JavaScript“

Funkcinis programavimas man buvo žvilgsnis į akis. Šis įrašas ir panašūs įrašai yra bandymas pasidalyti savo įžvalgomis ir perspektyvomis, kai aš einu į naujas funkcinio programavimo sritis.

„Ramda“ buvo mano „FP“ biblioteka dėl to, kad „JavaScript“ programinę įrangą lengviau funkcionuoti. Aš labai rekomenduoju.

Sudėtiniai blokai struktūrai formuoti. Gana gilūs dalykai ...

Vamzdis

Vamzdžio idėja yra paprasta - jis derina n funkcijas. Tai yra vamzdis, tekantis iš dešinės į dešinę ir iššaukiantis kiekvieną funkciją su paskutine išvestimi.

Parašykime funkciją, kuri grąžina kieno nors vardą.

getName = (person) => person.name
getName ({vardas: 'Buckethead'})
// 'Buckethead'

Parašykime funkciją, kurios didžiosios raidės yra stygos.

didžioji raidė = (eilutė) => string.toUpperCase ()
didžiosios raidės ('Buckethead')
// „BUCKETHEAD“

Taigi, jei norėtume gauti ir pavartoti asmens vardą, galėtume tai padaryti:

name = getName ({vardas: 'Buckethead'})
didžiosios raidės (vardas)
// „BUCKETHEAD“

Puiku, bet pašalinkime tą tarpinį kintamojo pavadinimą.

didžiosios raidės („getName“ ({vardas: 'Buckethead'}))

Geriau, bet man nepatinka tas lizdas. Jis gali būti perkrautas. Ką daryti, jei norime pridėti funkciją, kuri gauna pirmuosius 6 eilutės simbolius?

get6Characters = (string) => string.substring (0, 6)
„get6Characters“ („Buckethead“)
// 'kibiras'

Rezultatas:

get6Characters (didžiosios raidės (getName ({vardas: 'Buckethead'}))))
„BUCKET“

Būkime iš proto ir pridėkime funkciją atvirkštinėms stygoms.

atvirkštinė = (eilutė) => eilutė
  .splitas ('')
  .reverse ()
  .join ('')
atvirkštinė ('Buckethead')
// 'daehtekcuB'

Dabar mes turime:

atvirkštinė (get6Characters (didžiosios raidės (getName ({vardas: 'Buckethead'}))))))
// „TEKCUB“

Tai gali gauti šiek tiek ... daug.

Vamzdis į gelbėjimą!

Užuot trukdę funkcijas funkcijose ar sukūrę krūvą tarpinių kintamųjų, atlikite visus veiksmus!

vamzdis (
  getName,
  didžioji raidė,
  get6Characters,
  atvirkštinė
) ({vardas: 'Buckethead'})
// „TEKCUB“

Grynas menas. Tai panašu į pavedimų sąrašą!

Pažvelkime per ją.

Demonstraciniais tikslais naudosiu vamzdžio įgyvendinimą iš vieno iš Erico Elliotto funkcijų programavimo straipsnių.

vamzdis = (... fns) => x => fns.reduce ((v, f) => f (v), x)

Aš myliu šį mažą įdėklą.

Naudodamiesi poilsio parametrais, skaitykite mano straipsnį apie tai, mes galime nustatyti n funkcijas. Kiekviena funkcija gauna ankstesnės išvestį ir visa tai sumažina iki vienos vertės.

Ir jūs galite naudoti jį taip, kaip mes darėme aukščiau.

vamzdis (
  getName,
  didžioji raidė,
  get6Characters,
  atvirkštinė
) ({vardas: 'Buckethead'})
// „TEKCUB“

Išsiplėsiu sąrašą ir pridėsiu keletą derinimo pareiškimų ir eisime eilutė po eilutės.

vamzdis = (... funkcijos) => (vertė) => {
  derinimo priemonė;
  grąžinimo funkcijos
    .reduce ((currentValue, currentFunction) => {
       derinimo priemonė;
       grąžinti srovės funkciją (dabartinė vertė);
    }, vertė)
}

Paskambinkite mūsų pavyzdžiu ir leiskite stebuklams atsiskleisti.

Patikrinkite vietinius kintamuosius. funkcijos yra 4 funkcijų masyvas, o vertė yra {name: 'Buckethead'}.

Kadangi mes naudojome poilsio parametrus (dar kartą skaitykite mano straipsnį ), vamzdis leidžia naudoti bet kokį skaičių funkcijų. Jis tiesiog paskambins ir paskambins kiekvienam.

Kitame derinimo įrenginyje mes esame sumažinti. Čia „currentValue“ perduodama „currentFunction“ ir grąžinama.

Matome, kad rezultatas yra „Buckethead“, nes currentFunction grąžina bet kokio objekto .name savybę. Tai bus grąžinta sumažinus, tai reiškia, kad kitą kartą ji taps nauja „currentValue“. Paspauskite kitą derinimo įrankį ir pamatysime.

Dabar „currentValue“ yra „Buckethead“, nes būtent tai buvo grąžinta paskutinį kartą. „currentFunction“ yra didžiosios raidės, taigi „BUCKETHEAD“ bus kita „currentValue“.

Tą pačią idėją užmaskuokite pirmuosius 6 „BUCKETHEAD“ ženklus ir perduokite juos kitai funkcijai.

atvirkštinė ('. aedi emaS')

Ir viskas!

O kaip rašyti ()?

Tai tiesiog vamzdis kita kryptimi.

Taigi, jei norėtumėte to paties rezultato, kaip ir mūsų aukščiau esantis vamzdis, darytumėte priešingai.

komponuoti (
  atvirkščiai,
  get6Characters,
  didžioji raidė,
  getName,
) ({vardas: 'Buckethead'})

Atkreipkite dėmesį, kaip paskutinis „getName“ yra grandinėje, o pirmasis - atgal?

Čia yra greitas kompozicijos, vėlgi stebuklingo Eriko Ellioto, leidimas iš to paties straipsnio.

sudaryti = (... fns) => x => fns.reduceRight ((v, f) => f (v), x);

Paliksiu išplėsti šią funkciją naudodamas derinimo įrenginius, kaip pratimą jums. Žaisk su juo, naudokis juo, vertink tai. Ir svarbiausia, linksminkis!

Iki kito karto!

Pasirūpink,
Yazeed Bzadough