如何通过更改序列中的每个替代值来延迟评估序列?

How to lazily evaluate a sequence by altering every alternate values in the sequence?

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

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

我坚持实现接受数字项并计算序列总积和总和的函数,每个交替序列值符号都更改为负号。这是我为 objective:

实现的功能
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. 

当我尝试实现与 sum 类似的函数时,我才意识到我的函数是错误的。

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, …)

这样奇数被保留,偶数被取反。