Moe*_*ler 3 javascript ramda.js
我有一种情况需要这样做:
const f = (obj) => assoc('list', createList(obj), obj)
Run Code Online (Sandbox Code Playgroud)
由于我需要第二个和第三个参数的参数,因此禁止我执行以下操作:
const f = assoc('list', somehowGetObj())
Run Code Online (Sandbox Code Playgroud)
我也试过了,但是没有用:
const f = assoc('list', createList(__))
const f = converge(assoc, [createList, identity])
Run Code Online (Sandbox Code Playgroud)
有正确的方法来通过咖喱来做到这一点吗?
另一种选择是
chain(createList, assoc('list'))
Run Code Online (Sandbox Code Playgroud)
您可以在Ramda REPL上看到它的运行情况。
更新资料
为了进一步解释它是如何工作的,我将使用将在下一版Ramda中使用的变体:
chain(assoc('list'), createList)
Run Code Online (Sandbox Code Playgroud)
显示它如何与当前签名匹配:
chain :: Chain m => (a -> m b) -> m a -> m b
Run Code Online (Sandbox Code Playgroud)
Ramda 将函数视为FantasyLand Monads,因此也将其视为Chains。因此,要使以上功能专门化,我们有
chain :: (a -> Function x b) -> Function x a -> Function x -> b
Run Code Online (Sandbox Code Playgroud)
但Function x y可以更简单地写为x -> y,因此上述内容可以更简单地写为
chain :: (a -> x -> b) -> (x -> a) -> (x -> b)
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用以下(专用)类型:
createList :: OriginalData -> YourList (x -> a)
assoc :: String -> YourList -> OriginalData -> EnhancedData
assoc('list') :: YourList -> OriginalData -> EnhancedData (a -> x -> b)
Run Code Online (Sandbox Code Playgroud)
因此
chain(assoc('list'), createList) :: OriginalData -> EnhancedData (x -> b)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
893 次 |
| 最近记录: |