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