Javascript 我能把这个函数缩短一点吗?
我试图在javascript应用程序中更多地使用函数式编程。目前,我将该库用作此操作的基本库 我的愿望:Javascript 我能把这个函数缩短一点吗?,javascript,functional-programming,currying,ramda.js,Javascript,Functional Programming,Currying,Ramda.js,我试图在javascript应用程序中更多地使用函数式编程。目前,我将该库用作此操作的基本库 我的愿望: 创建一个函数findWithId(id,list),该函数返回列表中与输入id匹配的属性\u id 使其实现尽可能短,尽可能依赖现有代码 迄今为止取得的成就: 我的基地是R.find,它有这样的防御 查找::(a->Boolean)->[a]->a |未定义 我尝试了以下几种不同的解决方案: //Using ramdajs (ramdajs.com) var hasId = R.curr
findWithId(id,list)
,该函数返回列表中与输入id匹配的属性\u id
R.find
,它有这样的防御
查找::(a->Boolean)->[a]->a |未定义
我尝试了以下几种不同的解决方案:
//Using ramdajs (ramdajs.com)
var hasId = R.curry(function(id, item) {
return item._id === id
});
//This doesn't work
var findWithId_v1 = R.find(hasId);
//This works but can I make it as short as v1?
var findWithId_v2 = function(id, list) {
return R.find(hasId(id), list);
}
问题:
我是否可以使用标准的函数式编程工具(如compose、curry等)将findWithId_v2
缩短为findWithId_v1
普朗克演示
您正在寻找以下功能:
compose :: (a -> b) -> (b -> c) -> (a -> c)
hasId :: p -> (i -> Boolean)
find :: (i -> Boolean) -> ([i] -> i | undefined)
compose :: (p -> (i -> Boolean))
-> ((i -> Boolean) -> ([i] -> i | undefined))
-> (p -> ([i] -> i | undefined))
compose find hasId :: p -> ([i] -> i | undefined)
你会这么做的
var findWithId = R.compose(R.find, hasId)
哦,请注意,hasId
也不需要函数表达式:
var hasId = R.propEq('_id');
Ramda确实有一个函数可以帮助实现这一点,这个函数名为
useWith
。如果你能想出一个更好的名字,我会喜欢的。我有
您可以这样使用:
var findById = R.useWith(R.find, hasId, R.identity);
var find5 = findById(5);
find5([{id:3}, {id:5}]); //=> {id:5}
findById(5, [{id:3}, {id:5}]); //=> {id:5}
您不必提供上述R.identity
。这也会起作用,尽管我更愿意明确地说:
var findById = R.useWith(R.find, hasId);
“接受函数
fn
和任意数量的transformer函数,并返回一个新函数。当调用新函数时,它调用函数fn
,参数包括在新函数的连续参数上调用每个提供的处理程序的结果”,甚至更好,这不一定是我想做的。我想了解FP,如果我知道这是可能的,那么我可以在很多地方使用它。如果我知道不是,那么我就不会(经常)考虑是否可以改进我的代码。@Cerbrus在读了你的第二条评论后,我认为你不理解这个问题和/或主题。好吧,你为什么要用这个库来做呢?为什么你想“更多地转向函数式编程”?似乎不起作用,请检查更新的plnkr(与问题中的链接相同)。plnkr对我不起作用,但我仍在测试;你可能是对的,实际上findWithId(5)([{{u-id:3},{u-id:5}])
似乎对meAh有效,但不是findWithId(5,[{u-id:3},{u-id:5}])。一个函数包含两个参数。有一个函数接受一个参数,它返回另一个函数,该函数也接受一个参数。是的,因为compose与curried函数一起工作。。。您可以从类型签名中看到,compose find hasId
为您提供了一个函数,该函数接受a
(=p
),a返回一个c
——它是=([i]->i |未定义)
。作为FP的新手,我只想知道“useWith”是一个通用概念还是ramda特有的概念。我知道了,但似乎没有人有一个好的答案。问题的一部分在于,对于Haskell这样的语言,每个函数只接受一个参数,这从来都不是问题,我认为这个问题只会导致混淆。