Vyhledávání na webu

javascript - Proč má zdrojový kód Ramda více než jednu curry funkci, stejně jako Redux compose?


V zdrojovém kódu Ramda jsou funkce _curry1 _curry2 _curry3 _curryN

Tento vzor se objevuje také ve funkci compose v Reduxu

Přemýšlím, proč používají tento vzor místo toho, aby použili pouze jednu obecnou funkci pro všechny situace?

Zlepšuje tento vzor výkon?

Odpověď č. 1

Kromě Koushovy správné odpovědi bych chtěl dodat, že funkce začínající podtržítkem (_) jsou interní funkce Ramdy, nikde nezveřejněné.

Ramda (disclaimer: jsem jedním z jejích zakladatelů a hlavních autorů) zpřístupňuje curryN a užitečný doplněk k němu, curry. Ostatní jsou používány pouze interně. Nesou s sebou některé další zátěže, zejména při práci s místy pro zástupné hodnoty. Hlavní věc je, že nejsou plnohodnotnými funkcemi curry Ramda, pouze interními pomocníky, kteří nejsou připraveni k zpřístupnění. Mohli bychom je upravit tak, aby jimi byly, což byl účel toho citovaného komentáře, ale nikdy jsme se tím nezabývali. Bylo by z toho určité výhodné z hlediska výkonu, což je pravděpodobně důvod, proč Redux toto dělá, ale my jsme nezjistili, že by currying výrazně snižoval výkon, alespoň ne od doby, kdy jsme tyto pomocníky napsali.

V přísnější knihovně jako Sanctuary jsou to jediný typ API, který by byl povolen, protože vstupy nesmí být variadické. Ramda však dělá hodně pro podporu variadických funkcí. Ramda se rozhodla touto cestou nejít.

Odpověď č. 2

To je skvělá otázka, když jsem googloval, našel jsem tento problém. Citovat komentář CrossEye

Mohli bychom zvážit přímé zpřístupnění funkcí curry2 a curry3. Největším problémem by byla dokumentace. Jak bychom pohodlně vysvětlili kompromisy mezi curry, která je méně efektivní, ale zachovává kontext a předává všechny poskytnuté argumenty, a curry2/curry3, které mohou běžet rychleji, ale ztrácí svůj volací kontext a ignorují dodatečné poskytnuté argumenty. Ale nevidím žádné skutečné problémy s tím, že by tyto funkce byly skutečně zpřístupněny.

Takže to vypadá, že _curry1, _curry2, _curry3 nelze plně nahradit _curryN.