a + b + c)-6ren">
gpt4 book ai didi

javascript - 我无法理解 Ramda.js 中的 "lift"

转载 作者:行者123 更新时间:2023-12-03 02:17:55 25 4
gpt4 key购买 nike

查看 Ramda.js 的源代码,特别是“lift”函数。

lift

liftN

这是给定的示例:

var madd3 = R.lift(R.curry((a, b, c) => a + b + c));

madd3([1,2,3], [1,2,3], [1]); //=> [3, 4, 5, 4, 5, 6, 5, 6, 7]

所以结果的第一个数字很简单,abc都是每个数组的第一个元素。第二个对我来说不太容易理解。参数是每个数组的第二个值(2、2、未定义)还是第一个数组的第二个值以及第二个和第三个数组的第一个值?

即使不考虑这里发生的事情的顺序,我也没有真正看到它的值(value)。如果我在不先lift的情况下执行此操作,我最终会将数组concat生成为字符串。这似乎有点像 flatMap 一样工作,但我似乎无法理解其背后的逻辑。

最佳答案

Bergi 的回答很棒。但思考这个问题的另一种方法是变得更具体一些。 Ramda 确实需要在其文档中包含一个非列表示例,因为列表并没有真正捕获这一点。

让我们看一个简单的函数:

var add3 = (a, b, c) => a + b + c;

这对三个数字进行操作。但是如果您有容器保存数字怎么办?也许我们有Maybe s。我们不能简单地将它们加在一起:

const Just = Maybe.Just, Nothing = Maybe.Nothing;
add3(Just(10), Just(15), Just(17)); //=> ERROR!

(好吧,这是Javascript,它实际上不会在这里抛出错误,只是尝试连接不应该的东西......但它绝对不会做你想要的!)

如果我们能够将该功能提升到容器的水平,那将使我们的生活变得更轻松。 Bergi 指出的 lift3 是在 Ramda 中通过 liftN(3, fn) 实现的,以及一个简单使用的注释 lift(fn)所提供函数的数量。所以,我们可以这样做:

const madd3 = R.lift(add3);
madd3(Just(10), Just(15), Just(17)); //=> Just(42)
madd3(Just(10), Nothing(), Just(17)); //=> Nothing()

但是这个提升的函数不知道有关我们容器的任何具体信息,只知道它们实现了ap。 Ramda 为列表实现 ap 的方式类似于将函数应用于列表叉积中的元组,因此我们也可以这样做:

madd3([100, 200], [30, 40], [5, 6, 7]);
//=> [135, 136, 137, 145, 146, 147, 235, 236, 237, 245, 246, 247]

这就是我对lift的看法。它需要一个在某些值的级别上工作的函数,并将其提升为在这些值的容器级别上工作的函数。

关于javascript - 我无法理解 Ramda.js 中的 "lift",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36558598/

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