在curried arrow函数中捕获变量

时间:2016-10-29 11:23:11

标签: recursion lambda ecmascript-6 currying arrow-functions

箭头lambda和es6中的其他功能简化了功能风格的写作js,包括currying
我正在测试array map的实施,但我遇到了一个问题:
这是我的实施:

let map = fn => a => a.length ?  [fn(a[0]), ...map(fn)(a.slice(1))]  : [];
let plus_10 = map(n => n+10);
plus_10([1,2,3]); // [11, 12, 13]

但是,此实现在每次迭代时重新创建array_mapper函数...map(fn)

捕获array_mapper函数并在所有迭代中引用它会很好 这是一个有效的实施方案:

let map = fn => {
    let array_mapper = a => a.length ?  [fn(a[0]), ...array_mapper(a.slice(1))]  : [];
    return array_mapper;
};  

但是这会制动fp的可读性和整洁性 我做了,只是为了测试,另一个(尽管是丑陋的)实现,但它不是语法有效:

let map = fn => (let array_mapper = a => a.length ?  [fn(a[0]), ...array_mapper(a.slice(1))]  : [], array_mapper);

任何线索?

编辑:
关于...spread表演的说明: 使用10000大小的数组在chrome中测试此映射函数需要11秒! 但使用.concat代替传播...

let map = fn => a => a.length ?  [fn(a[0])].concat(map(fn)(a.slice(1)))  : [];

执行时间降至600毫秒

0 个答案:

没有答案