Сопрограммы на F #, которые дают значение - PullRequest
0 голосов
/ 24 января 2019

Я хочу лучше понять продолжения и сопрограммы.Я хочу закодировать их без использования seq или async рабочих процессов.

Я нашел несколько реализаций сопрограмм в F# этих простых сопрограммах , и это изfsharpsnippets

Мой вопрос заключается в том, как можно реализовать выход сопрограммы, который возвращает значения для вызывающих сопрограмм, например:

let anothercoroutine= coroutine {
    do! yieldvalue' "hello"
    do! yieldvalue' "world"
}
coroutine{
    let! a = yield' anothercoroutine
    let! b = yield' anothercoroutine
    return a + " " + b
} // it would return "hello world"

Это только один пример "hello world"то, что я хочу достичь, но мне действительно не нужно anothercoroutine, чтобы быть генератором последовательности, хотя это может быть ... Этот код будет выполняться рядом с другими сопрограммами, которые были запланированы для этого.

Я хотел знать, есть ли какое-то неявное ограничение на F#.Я пытался, но это оказалось сложнее, чем ожидалось, поэтому мне нужно знать, просто ли я провожу свое время в невыполнимой проблеме.

1 Ответ

0 голосов
/ 25 января 2019

Мы могли бы многое обсудить с точки зрения того, как лучше всего реализовать сопрограммы в F #, и преимуществами различных существующих реализаций, но я просто попытаюсь ответить на конкретный вопрос, который вы задали здесь.В частности, почему этот синтаксис не используется:

let anothercoroutine= coroutine {
    do! yieldvalue' "hello"
    do! yieldvalue' "world"
}

Проблема здесь заключается в значении do! в выражении вычисления F #.Эта удобная таблица показывает нам, что каждое встроенное ключевое слово делает в компоновщике вычислений:

De-sugared computations

Как видите, do! просто вызывает вычислениефункция Bind строителя, с продолжением приема единиц.Следовательно, в основном подразумевается, что expr будет возвращать единицу, и, следовательно, не является той функцией, генерирующей значение, которая использовалась бы для получения промежуточных результатов из сопрограммы.

...