如何在typescript中生成延迟迭代的东西

时间:2017-08-20 13:05:02

标签: javascript typescript lazy-evaluation lazy-sequences

目前我仍然在做这个问题:

  

制作通用的无限序列初始化函数   创造无限的懒惰序列。它将参数作为一个函数   从当前值计算下一个值。换句话说,它   应该是像naturalNumbers这样的函数的“工厂”。因此,如果我们   调用我们的函数initSequence,然后initSequence(n => n + 1)将返回   一个等于naturalNumbers的函数。

给出了这个模板

    interface LazySequence<T> {
    value: T;
    next(): LazySequence<T>;
}

// Implement the function:
function initSequence<T>(transform: (value: T) => T): (initialValue: T) => LazySequence<T>
{
    // Your code here 
}

到目前为止,这是我在TypeScript中的代码

interface LazySequence<T> {
    value: T;
    next(): LazySequence<T>;
}

// Implement the function:
function initSequence<T>(transform: (value: T) => T): (initialValue: T) => LazySequence<T>
{
    // Your code here ...
    return () => initSequence(v=>v+1) => LazySequence;
}

似乎代码无法正常工作。任何人都可以帮忙吗?那么任何人都可以对懒惰评价,懒惰迭代和其他懒惰事物做出明确的解释吗? 非常感谢

1 个答案:

答案 0 :(得分:2)

不确定是否需要使用给定的接口,但似乎需要生成器功能。阅读here

一个例子可以如下:

// A generic infinite sequence generator function.
function* infiniteSequence<T>(initialValue: T, transform: (value: T) => T): IterableIterator<T> {
    while (true) {
        yield initialValue;
        initialValue = transform(initialValue);
    }
}

// create different sequences using the generic sequence generator function.

let intSequence = infiniteSequence(1, n => n + 1); // sequence of natural numbers
console.log(intSequence.next().value); // 1
console.log(intSequence.next().value); // 2
console.log(intSequence.next().value); // 3 

let oddSequence = infiniteSequence(1, n => n + 2); // sequence of odd numbers
console.log(oddSequence.next().value); // 1
console.log(oddSequence.next().value); // 3
console.log(oddSequence.next().value); // 5

let evenSequence = infiniteSequence(0, n => n + 2); // sequence of even numbers
console.log(evenSequence.next().value); // 0
console.log(evenSequence.next().value); // 2 
console.log(evenSequence.next().value); // 4

根据OP的评论进行更新:

由于这个问题似乎是一个功课,我将尝试提供一些有用的提示。

  1. 考虑initSequence的返回类型(initialValue: T) => LazySequence<T>,但是您返回的() => initSequence(v=>v+1) => LazySequence与所需的返回类型不匹配。换句话说,您需要返回一个带有T类型值的函数,返回类型为LazySequence<T>对象。阅读herehere中的箭头功能。

  2. 考虑如何构建接口的对象。提示:鸭子打字。阅读此here

  3. 此问题的最后一点是构造next方法和value属性。请注意,next会再次返回类型为LazySequence<T>对象,其中value应该是序列中的下一个值(这是我假设的部分)。请注意initSequence(...)(...)可以返回此类对象。

  4. 玩得开心:)

    希望这有帮助。