gpt4 book ai didi

javascript - 如何组合函数然后在 Lodash/FP 中应用参数

转载 作者:行者123 更新时间:2023-12-01 15:54:11 28 4
gpt4 key购买 nike

我正在尝试通过使用 Lodash/FP 清理一些旧代码来了解有关在函数式编程中使用柯里化(Currying)和组合的更多信息。但是,我反复遇到我有一个函数并且我想传递一个或多个函数的情况。然后,我想将用作参数的值传递给我传递给原始函数的函数。

我发现很难准确解释我想要做什么,所以我制作了一个 JS Fiddle 来展示我是如何尝试解决这个问题的:
https://jsfiddle.net/harimau777/rqkLf1rg/2/

const foo = a => `${a}${a}`
// Desired Behavior: const ans1 = (a, b) => `${foo(a)}${foo(b)}`
const ans1 = _.compose(
(a, b) => `${a}${b}`,
foo,
foo
)
// Desired Result: '1122'
console.log(ans1('1', '2'))

// Desired Behavior: const ans2 = a => a.map(a => a + 1)
const ans2 = _.compose(
_.map,
a => a + 1
)
//Desired Result: [2, 3, 4]
console.log(ans2([1, 2, 3]))

根据下面 Ori Drori 的回答,我认为我可以澄清我的问题(这是人们通常如何跟进 StackOverflow 而不是提出新问题的方式?):
假设我不想对两个输入应用相同的函数序列,而是对第一个输入应用一个函数序列,对第二个输入应用一个不同的序列,并将两个结果用作 _.compose 其余部分的输入。我可以这样做:
const f1 = _.compose(<Some sequence of functions>)
const f2 = _.compose(<Some sequence of functions>)
const f3 = <A function which takes two inputs>
const ans = _.compose(
<More functions here>,
f3
)(f1(a), f2(b))
console.log(ans)

但是,我想知道是否有一种方法可以使用单个 compose 来处理这个问题,或者是否有任何模式倾向于在函数式编程中用于处理这样的情况。

最佳答案

LodashFPs _.compose() ( _.flowRight() in lodash)通过将参数应用于最右边(代码中的底部)函数,并将结果传递给左边的函数,依此类推:

_.compose(a, b, c)(params) -> a(b(c(params)))

这意味着每个函数,除了最右边的函数,只接收一个参数。

您可以通过稍微更改方法来获得第一个示例:

const ans1 = _.compose(
arr => arr.join(''), // joins the params to one string
(...args) => args.map((s) => `${s}${s}`) // returns an array of double params
)

// Desired Result: '1122'
console.log(ans1('1', '2'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash-fp/0.10.4/lodash-fp.min.js"></script>


在第二个示例中,您要创建一个通过预定义回调映射的新方法。由于 lodash/fp 方法是自动的 curried ,您可以将回调提供给 _.map() ,并获得一种新方法。由于 _.map(),Compose 将无法在此处工作不直接使用方法的结果,而是将其应用于数组中的每个项目:

const ans2 = _.map(a => a + 1)

//Desired Result: [2, 3, 4]
console.log(ans2([1, 2, 3]))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash-fp/0.10.4/lodash-fp.min.js"></script>



您在澄清中提出的案例可以由 _.useWith() 处理。 (在 lodash 中称为 _.overArgs() ):

Creates a function that invokes func with its arguments transformed.



但是,不推荐使用它,因为它会降低可读性。

例子:

const foo = a => `${a}${a}`

const ans1 = _.useWith(
(a, b) => `${a}${b}`,
[
foo,
foo
]
)

const result = ans1(1, 2)

console.log(result)
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>

关于javascript - 如何组合函数然后在 Lodash/FP 中应用参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48426489/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com