Javascript 如何通过改变序列中的每个备选值来惰性地评估序列?

Javascript 如何通过改变序列中的每个备选值来惰性地评估序列?,javascript,lazy-evaluation,lazy-sequences,Javascript,Lazy Evaluation,Lazy Sequences,我已经实现了一个惰性无限序列函数以及3个名为take、reduce和map的函数。take函数类似于Haskell的实现,在Haskell的实现中,它从给定有限值的无限序列中获取有限序列,以及Javascript中使用有限序列类型的常用reduce和map函数 现在,我尝试使用应用于序列值的各种条件来计算序列中的值 我一直致力于实现函数,这些函数包含一个数字项,并计算序列的总积和和,每个交替的序列值符号都变为负号。以下是我为实现该目标而实施的功能: function alternatingPro

我已经实现了一个惰性无限序列函数以及3个名为take、reduce和map的函数。take函数类似于Haskell的实现,在Haskell的实现中,它从给定有限值的无限序列中获取有限序列,以及Javascript中使用有限序列类型的常用reduce和map函数

现在,我尝试使用应用于序列值的各种条件来计算序列中的值

我一直致力于实现函数,这些函数包含一个数字项,并计算序列的总积和和,每个交替的序列值符号都变为负号。以下是我为实现该目标而实施的功能:

function alternatingProduct(term) {
    return reduce((x, y) => x * y, take(term, map(x => -x, generateSequence((v) => (v + 1))(1))), 1);
}
函数应该如何工作,是它在序列中缓慢地接受,并将每个可选值符号从正变为负。例如,当生成1到3的序列时,序列中的2应该是负数,给出了整个有限序列的总乘积-6的答案

最初我以为我的代码在我调用

alternatingProduct(4) 

//where it returns 24.

alternatingProduct(3)

//where it returns -6. 
当我试图实现一个类似的求和函数时,我意识到我的函数是错误的

function alternatingSum(term) {
    return reduce((x, y) => x + y, take(term, map(x => -x, generateSequence((v) => (v + 1))(1))), 0);
}

alternatingSum(3)
//should return 2 because of 1+(-2)+3  but it returned 5 instead 

alternatingSum(4)
//should return -2 because of 1+(-2)+3+(-4) but it returned -9 instead

现在我意识到我的函数映射改变了序列中的每个值。我不知道如何将代码更改为只更改惰性序列的交替值。我不熟悉惰性序列和评估,只是尝试一下,所以非常感谢您的帮助

map(x => x%2 ? x : -x, …)

因此,奇数值被保留,偶数值被否定。

提示:阅读以参数的方式可以做什么。其中一个是
index
@tadman这是我创建的reduce函数,因为内置函数只在数组上工作。我创建的无限序列不是数组类型。谢谢你的指针,我会看看我能做些什么来修改reduce函数,如果你让你的函数以类似的方式运行,你会得到你需要的信息。很好的解决方案。如果我只创建了一个奇数序列,例如1,3,5,7,但我仍然想对每个可选值求反,那该怎么办?@mightyandweakcoder然后检查
x-1
是否可以被4整除?但一般来说,您需要一个带有帮助器的
zipWith,它允许您合并两个序列,例如任意值之一和交替
1
/
-1