f is not the same as x => f(x) when it comes to evaluation in a strictly evaluated language like Javascript. The latter renders a function slightly more lazy:
const mapFold = f => acc => ix => { for (let [i, x] of ix) acc = f(acc) (x); return acc; }; const arrSnoc = xs => x => (xs.push(x), xs); const mapToArr = mapFold(arrSnoc) ([]); const mapToArr_ = ix => // ^^ mapFold(arrSnoc) ([]) (ix); // ^^^^ const foo = new Map([[0, "foo"], [1, "bar"], [2, "baz"]]); mapToArr(foo); mapToArr_(foo); mapToArr(foo); // ["foo", "bar", "baz", "foo", "bar", "baz"] mapToArr_(foo); // ["foo", "bar", "baz"] mapToArr gets a fesh array as accumulator each time it is called and hence keeps the side effect caused by arrSnoc local. Adding redundant lambda abstractions to a derived function is called eta abstraction and the opposite operation eta reduction.
Top comments (0)