我有一种情况需要这样做:
const f = (obj) => assoc('list', createList(obj), obj)
由于我需要第二个和第三个参数的参数,禁止我做类似的事情:
const f = assoc('list', somehowGetObj())
我也试过这个,但那不起作用:
const f = assoc('list', createList(__))
const f = converge(assoc, [createList, identity])
通过currying有没有正确的方法呢?
答案 0 :(得分:5)
另一种选择是
chain(createList, assoc('list'))
您可以在 Ramda REPL 上查看。
<强>更新强>
有关其工作原理的进一步说明,我将使用适用于下一版Ramda的变体:
chain(assoc('list'), createList)
显示它与当前签名的匹配程度:
chain :: Chain m => (a -> m b) -> m a -> m b
Ramda将函数视为FantasyLand Monads,因此也视为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)
答案 1 :(得分:1)
B 2
B 4