Трубы - это действительно элегантная, действительно простая версия итераций. Вы можете очень легко написать код pipe, используя примитивы await
и yield
. Паоло Каприотти расширил концепцию труб с помощью guarded pipes, который использует немного более сложный примитив tryAwait
, который позволяет трубе выполнить некоторую финализацию, когда входной поток закончится.
Реализация guarded pipe переопределяет await
в терминах tryAwait
:
await = tryAwait >>= maybe discard return
Мой вопрос заключается в следующем: если я пишу код, ориентированный на более простую реализацию Pipes (использующий await
и yield
), используя тот же самый код, будет ли он вести себя так же, если я перейду на реализацию guarded pipe? Другими словами, можно ли рассматривать код guarded pipe как просто супермножество кода pipe с точки зрения поведения?