let map = (fn,[head, ...tail]) => head === undefined ? [] : [fn(head), ...map(fn,tail)] console.log("map(x=>x+1,[1,2,3,4]) :",map(x=>x+1,[1,2,3,4])) let filter = (predicate, [head, ...tail]) => head === undefined ? [] : predicate(head) ? [head, ...filter(predicate, tail)] : filter(predicate, tail) console.log("filter(x=>x>2,[1,2,3,4,5]) :", filter(x=>x>2,[1,2,3,4,5])) let reduce = (fn, acc, [head, ...tail]) => head === undefined ? acc : reduce(fn, fn(acc, head), tail); console.log("reduce((x,y)=>x+y,0,[1,2,3,4]) :",reduce((x,y)=>x+y,0,[1,2,3,4])) let map_derived = (f, list) => reduce((acc, next) => [...acc, f(next)], [], list); console.log("map_derived(x=>x+1,[1,2,3,4]) :",map_derived(x=>x+1,[1,2,3,4])) let filter_derived = (predicate, list) => reduce((acc, next) => predicate(next) ? [...acc, next] : acc, [], list); console.log("filter_derived(x=>x>2,[1,2,3,4,5]) :", filter(x=>x>2,[1,2,3,4,5]))