【问题标题】:how to generate lazy iteration thing in typescript如何在打字稿中生成惰性迭代
【发布时间】:2017-08-20 13:05:02
【问题描述】:

目前我还在做这个问题:

制作一个通用的无限序列初始化函数 创建无限的惰性序列。它将作为参数的函数 从当前值计算下一个值。换句话说,它 应该是 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;
}

而且代码似乎没有相应地工作。有人可以帮忙吗?那么任何人都可以对惰性评估,惰性迭代和其他惰性事物做出明确的解释吗? 非常感谢

【问题讨论】:

  • 您是否有理由不为此使用现有工具,例如生成器(语言内置)或可观察对象(通过 Rx 之类的库)?
  • 您的代码似乎没有进行类型检查。还是我错过了什么?
  • 这似乎是一个“家庭作业”。如果是这种情况,请参考meta.stackoverflow.com/questions/334822/…

标签: javascript typescript lazy-evaluation lazy-sequences


【解决方案1】:

不确定是否需要使用给定的接口,但似乎需要生成器功能。阅读此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) =&gt; LazySequence&lt;T&gt;,但你返回的是() =&gt; initSequence(v=&gt;v+1) =&gt; LazySequence,它与所需的返回类型不匹配。换句话说,你需要返回一个函数,它接受一个T 类型的值,返回一个LazySequence&lt;T&gt; 类型的object。阅读 herehere 中的箭头函数。

  2. 想想如何构造一个接口的对象。提示:鸭子打字。阅读此here

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

玩得开心:)

希望这会有所帮助。

【讨论】:

  • 实际上需要实现给定的接口。我只是很困惑如何正确使用它
  • @phoenixdamn88 由于您的问题似乎是一个家庭作业问题,我已经用一些提示更新了我的答案。希望对您有所帮助。
猜你喜欢
  • 2022-12-14
  • 1970-01-01
  • 2016-09-13
  • 2018-10-17
  • 1970-01-01
  • 1970-01-01
  • 2017-08-21
  • 2020-03-04
  • 2021-09-25
相关资源
最近更新 更多