使用 Ramda.js 的函数的 Pointfree 版本
Pointfree version of a function using Ramda.js
我正在尝试使以下函数无意义。我不确定如何将争论传递给内部函数。我正在使用 Ramda.js,但我认为这个概念比那个更笼统。这是我的代码。
search = function(id) {
return find(propEq('id', id), items)
}
在这里,您会注意到 id
参数被传递给了内部函数 propEq
。这是我不确定的部分。
稍微修改一下,您可以获得无积分版本,但自动柯里化会出现问题,所以我不得不通过手动柯里化函数来复制一些功能。这是一个班轮:
search = compose(flip(find)(items), propEq('id'))
为简洁起见,使用 ES6 语法:
var {compose} = R
var find = f => xs => R.find(f, xs)
var propEq = p => x => R.propEq(p, x)
var flip = f => a => b => f(b)(a)
// Example:
var items = [{id: 1}, {id: 2}, {id: 3}]
// point-full
var search = function(id) {
return find(propEq('id')(id))(items)
}
console.log(search(2))
// point-free
search = compose(flip(find)(items), propEq('id'))
console.log(search(2))
虽然没有意义。
这个问题比 Ramda 更笼统,但 Ramda 确实有几个函数可以使这样的事情变得更容易,尤其是 useWith
and converge
。
这可以用useWith
写成免分的,像这样:
var search = useWith(find, propEq('id'), identity);
search(2, items); //=> {id: 2}
您可以看到它的实际效果 on the Ramda REPL。
你只需要先咖喱一下。然后你可以先给它id,items会是它前面的函数的输出。
例如:
const search = R.curry((id, items) => R.find(R.propEq('id', id), items));
const testSearch = R.pipe(
R.identity(() => [{id: '123'}, {id: 'asdf'}]),
search('123')
);
testSearch(); // { id: '123' }
我正在尝试使以下函数无意义。我不确定如何将争论传递给内部函数。我正在使用 Ramda.js,但我认为这个概念比那个更笼统。这是我的代码。
search = function(id) {
return find(propEq('id', id), items)
}
在这里,您会注意到 id
参数被传递给了内部函数 propEq
。这是我不确定的部分。
稍微修改一下,您可以获得无积分版本,但自动柯里化会出现问题,所以我不得不通过手动柯里化函数来复制一些功能。这是一个班轮:
search = compose(flip(find)(items), propEq('id'))
为简洁起见,使用 ES6 语法:
var {compose} = R
var find = f => xs => R.find(f, xs)
var propEq = p => x => R.propEq(p, x)
var flip = f => a => b => f(b)(a)
// Example:
var items = [{id: 1}, {id: 2}, {id: 3}]
// point-full
var search = function(id) {
return find(propEq('id')(id))(items)
}
console.log(search(2))
// point-free
search = compose(flip(find)(items), propEq('id'))
console.log(search(2))
虽然没有意义。
这个问题比 Ramda 更笼统,但 Ramda 确实有几个函数可以使这样的事情变得更容易,尤其是 useWith
and converge
。
这可以用useWith
写成免分的,像这样:
var search = useWith(find, propEq('id'), identity);
search(2, items); //=> {id: 2}
您可以看到它的实际效果 on the Ramda REPL。
你只需要先咖喱一下。然后你可以先给它id,items会是它前面的函数的输出。
例如:
const search = R.curry((id, items) => R.find(R.propEq('id', id), items));
const testSearch = R.pipe(
R.identity(() => [{id: '123'}, {id: 'asdf'}]),
search('123')
);
testSearch(); // { id: '123' }