Я экспериментировал с новым пакетом pipe-http, и у меня возникла мысль. У меня есть два парсера для веб-страницы, одна из которых возвращает позиции и другой номер из другого места на странице. Когда я хватаю страницу, было бы неплохо объединить эти парсеры вместе и получить их результаты одновременно от одного и того же производителя, вместо того, чтобы извлекать страницу дважды или извлекать весь html в память и анализировать ее дважды.Соедините двух потребителей с одним потребителем, который возвращает несколько значений?
Другими словами, у вас есть два потребителя:
c1 :: Consumer a m r1
c2 :: Consumer a m r2
Можно ли сделать такую функцию:
combineConsumers :: Consumer a m r1 -> Consumer a m r2 -> Consumer a m (r1, r2)
combineConsumers = undefined
Я пытался несколько вещей, но я не могу выясните это. Я понимаю, если это невозможно, но это было бы удобно.
Edit:
Я сожалею, что это получается, что я делал предположение о трубах-attoparsec, из-за мой опыт с трубопроводом-attoparsec, что заставило меня задать неправильный вопрос. Pipes-attoparsec превращает attoparsec в трубы Parser, когда я только предполагал, что он вернет трубы Consumer. Это означает, что я не могу фактически превратить два парнера attoparsec в потребителей, которые берут текст и возвращают результат, а затем используют их с простой старой экосистемой труб. Извините, но я просто не понимаю, как разбираются трубы.
Несмотря на то, что это не помогает мне, ответ Артура в значительной степени соответствует тому, что я себе представлял, когда задавал этот вопрос, и я, вероятно, в конечном итоге воспользуюсь его решением в будущем. Тем временем я просто собираюсь использовать кабелепровод.
Можете ли вы ссылаться на одного или обоих потребителей в качестве примера? Большинство кодов труб, с которыми я знаком, не использует базовое значение потребителя, не используется таким образом. Если вы не используете базовое значение, с другой стороны, это тривиальный zip двух потребителей вместе. – Davorak