【问题标题】:Ramda currying: how to apply argument to multiple parametersRamda currying:如何将参数应用于多个参数
【发布时间】:2017-03-14 08:25:31
【问题描述】:

我有一种情况需要这样做:

const f = (obj) => assoc('list', createList(obj), obj)

由于我需要第二个和第三个参数的参数,因此禁止我执行以下操作:

const f = assoc('list', somehowGetObj())

我也试过了,但是没用:

const f = assoc('list', createList(__))
const f = converge(assoc, [createList, identity])

有没有适当的方法通过柯里化来做到这一点?

【问题讨论】:

    标签: javascript ramda.js


    【解决方案1】:
    const f = converge(assoc('list'), [createList, identity])
    

    【讨论】:

      【解决方案2】:

      另一种选择是

      chain(createList, assoc('list'))
      

      您可以在 Ramda REPL 上看到实际效果。

      更新

      为了进一步解释其工作原理,我将使用适用于下一版本 Ramda 的变体:

      chain(assoc('list'), createList)
      

      显示它如何匹配当前签名:

      chain :: Chain m => (a -> m b) -> m a -> m b
      

      Ramda 将函数视为FantasyLandMonads,因此也视为Chains。因此,为了将上述内容专门化为功能,我们有

      chain :: (a -> Function x b) -> Function x a -> Function x -> b
      

      但是Function x y可以更简单的写成x -> y,所以上面可以更简单的写成

      chain :: (a -> x -> b) -> (x -> a) -> (x -> b)
      

      然后你可以使用这些(专门的)类型:

      createList :: OriginalData -> YourList                              (x -> a)
      assoc :: String -> YourList -> OriginalData -> EnhancedData
      assoc('list') :: YourList -> OriginalData -> EnhancedData           (a -> x -> b)
      

      因此

      chain(assoc('list'), createList) :: OriginalData -> EnhancedData    (x -> b)
      

      【讨论】:

      • 有效!虽然,文档似乎没有涵盖这个用例,还是我遗漏了什么? ramdajs.com/docs/#chain
      • 你是对的。 Ramda 的文档与代码不匹配。记录的签名是我们想要的,a recent change 得到匹配的代码。如果您使用 Ramda 的下一个版本,则必须反转参数:chain(assoc('list'), createList)
      猜你喜欢
      • 1970-01-01
      • 2021-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-22
      • 2011-08-17
      相关资源
      最近更新 更多