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

我试图在javascript应用程序中更多地使用函数式编程。目前,我将该库用作此操作的基本库

我的愿望:
  • 创建一个函数
    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这样的语言,每个函数只接受一个参数,这从来都不是问题,我认为这个问题只会导致混淆。