如何解决此协程循环引用错误?

时间:2019-04-23 09:52:33

标签: typescript types coroutine

明天我要对协程进行考试,但问题是该章的讲义已被取消,不能替代。因此,我决定独自学习协程,因为这很难。

我有老师教过的Typescript代码示例,但问题是该示例包含错误,而且我不知道如何解决。

type Coroutine<s, e, a> = Fun<s, Either<NoRes<s, e, a>, Pair<a, s>>>
type NoRes<s, e, a> = Either<e, Continuation<s, e, a>>
type Continuation<s, e, a> = Pair<s, Coroutine<s, e, a>>

我得到的错误是:

  

类型别名“协程”循环引用自身

     

类型别名'NoRes'循环引用自身

     

类型别名'Continuation'循环引用自身

我理解为什么会发生这种情况,因为Coroutine的类型为NoResNoRes的类型为Continuation,在这里,我们回到了完成这一圈的位置:{ {1}}的类型为Continuation

我不了解的是如何解决此问题,替代方案是如何实现协程。那么,有没有人比上面的例子更好,更可行?

依赖项:

乐趣:

Coroutine

要么:

type Fun<a, b> = {
    f: (_: a) => b
    then: <c>(this: Fun<a, b>, g: Fun<b, c>) => Fun<a, c>
}

配对:

type Either<a, b> = {
    kind: "left"
    value: a
} | {
    kind: "right"
    value: b
}

1 个答案:

答案 0 :(得分:1)

明天我要参加相同的考试,并且也遇到错误。

我设法通过创建一个专门为续程协同开发的接口来使其编译,如下所示:

type Coroutine<s,e,a> = Fun<s, Either<NoRes<s,e,a>,Pair<a,s>>>
type NoRes<s,e,a> = Either<e,Continuation<s,e,a>>
type Continuation<s,e,a> = Pair<s,ContinuedCoroutine<s,e,a>>

interface ContinuedCoroutine<s,e,a> extends Coroutine<s,e,a> { }

感觉像一个变通方法,但是它也会使单元编译。我仍在尝试弄清楚join,map等。

This可能会帮助您进一步。如果您找到更好的方法,请告诉我;)