Как решить эту ошибку сопроводительной ссылки Coroutine? - PullRequest
1 голос
/ 23 апреля 2019

У меня завтра экзамен на сопрограммы, но проблема в том, что лекция по этой главе была отменена для экзамена и не заменена.Поэтому я решил изучать сопрограммы самостоятельно, что было трудно.

У меня есть пример кода в 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>>

Я получаю следующие ошибки:

Псевдоним типа 'Coroutine' циклически ссылается на себя

Псевдоним типа 'NoRes' циклически ссылается на себя

Псевдоним типа «Продолжение» циклически ссылается на себя

Я понимаю, почему это происходит, потому что Coroutine имеет тип NoRes, NoRes имеет тип Continuation и вот мы вернулисьдля начала, чтобы завершить круг: Continuation имеет тип Coroutine.

Чего я не понимаю, так это как решить эту проблему, а альтернатива - как реализовать сопрограмму.Так есть ли у кого-нибудь лучший и рабочий пример, чем приведенный выше?

Зависимости:

Fun:

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
}

Пара:

type Pair<a, b> = { First: a, Second: b }

1 Ответ

2 голосов
/ 23 апреля 2019

У меня завтра тот же экзамен, и у меня тоже ошибка.

Мне удалось его скомпилировать, создав интерфейс, специально созданный для продолжения сопрограммы, например:

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> { }

Походит на обходной путь, но это также заставит юнит компилироваться. Я все еще пытаюсь выяснить, присоединиться, карта и т. Д. Однако ...

Это Может помочь вам в дальнейшем. Если вы найдете лучший способ, пожалуйста, обновите меня;)

...