繁体   English   中英

使用Ramda.js的函数的Pointfree版本

[英]Pointfree version of a function using Ramda.js

我试图使以下功能无点。 我不知道如何将争论传递给内部功能。 我正在使用Ramda.js,但我认为这个概念比这更概括。 这是我的代码。

search = function(id) {
  return find(propEq('id', id), items)
}

在这里,您将注意到id参数被传递给内部函数propEq 这是我不确定的部分。

这个问题比Ramda更普遍,但Ramda确实有几个函数可以让这样的东西变得更容易,尤其是useWithconverge

这可以通过useWith写成免费点,如下所示:

var search = useWith(find, propEq('id'), identity);
search(2, items); //=> {id:  2}

你可以在Ramda REPL上看到它。

通过一些修补,你可以得到一个无点版本,但自动调整会产生问题,所以我不得不通过手动调整函数来复制一些功能。 这是一个班轮:

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))

虽然这是无关紧要的。

演示: http //jsbin.com/batedi/edit?js,output

你只需要先把它弄好。 然后你可以先给它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' }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM