Poznaję funkcje typu pointfree i próbuję zaimplementować ten rekursywny remover w tym stylu.Bezpośrednia rekursja w JS z ramdą
działa, ale jest nie pointfree:
function removeNulls(obj) {
return R.ifElse(
R.either(R.is(Array), R.is(Object)),
R.pipe(
R.filter(R.pipe(R.isNil, R.not)),
R.map(removeNulls)
),
R.identity
)(obj)
}
module.exports = removeNulls
Poniżej moja nie działa próba na to:
const removeNulls = R.ifElse(
R.either(R.is(Array), R.is(Object)),
R.pipe(
R.filter(R.pipe(R.isNil, R.not)),
// throws `ReferenceError: removeNulls is not defined`
R.map(removeNulls)
),
R.identity
)
Nie możesz, ponieważ JavaScript nie stanowią drogę do leniwie deklaruj argumenty. Możesz mieć szczęście używając kombinatora 'Y', ale stanie się to naprawdę brzydkie. – Bergi
@Bergi Dzięki za cynk, zostawię go tak, jak jest. Chciałbym dowiedzieć się więcej o użyciu kombinatora Y, jeśli tylko do przyszłego użytku. Wygląda na to, że [ramda nie ma kombinatora 'Y'] (https://gist.github.com/Avaq/1f0636ec5c8d6aed2e45), ale nie wiem, dokąd się udać. Trochę trudno jest google dla ... –
@Bergi jest poprawny, nie można tego zrobić ze stałą ... ale możesz to zrobić, jeśli oddzielisz akcję od zastosowania: const filterNotNull = filter (pipe (isNil nie)) const recurseAction = działania => ifElse ( albo (jest (array) jest (Object)), rura ( działania, mapę (działanie) ) tożsamość ) –