Qual abordagem para o tratamento de erros para usar com pipes (-core)?

Atualmente estou escrevendo um encanamento pipes-core / attoparsec para um pequeno projeto meu. Eu quero que cada parser para dar um tubo que aguardaByteString entrada para o analisador e produz quaisquer valores analisados ​​(reiniciando o analisador). Sem tratamento de erros, teria um tipo como

parserP :: Monad m => Parser a -> Pipe ByteString a m r

Agora, não tenho certeza sobre o que fazer com os erros de análise. Minhas idéias atuais são:

para adicionar os erros ao tipo de retorno (isto é, retornar um valor emEither ParseError r em vez de apenasr)exigir que a mônada forneça o mecanismo de tratamento de erros (ou seja, exigir que a mônada que o tubo seja tomado para implementarMonadError)forçar a mônada para fornecer um mecanismo de erro, tomando o tubo sobreErrorT e m a paraqualquer mongamadicionar parâmetros, permitindo que o usuário especifique o comportamento (algo como(ParseError -> P.Pipe ByteString a m r), e simplesmente ligar para o tubo fornecido em caso de um erro de análise)

A primeira solução parece errada, já que usar o tipo de retorno de um pipe para tratamento de erros parece ser um hack. Isso, por um lado, torna a composição com o pipe mais feia e parece ser mais ou menos incluída pela solução final (além de possivelmente perder a capacidade de deixar um pipe downstream ser capaz de se recuperar de um erro usando tryAwait e parar de aguardar valores ?)

A segunda solução parece errada, embora eu não consiga entender por quê. Possivelmente, uma vez que (poderia?) Também exigiria um parâmetro para traduzir o ParseError em qualquer tipo de erro que a mônada tivesse (a menos que desejemos requerer que a mônada implementeMonadError ParseError, o que parece que resultaria em muita contabilidade). Finalmente, eu não consigo lembrar de verMonadError em torno de tudo isso, o que sugere que há algum problema em usá-lo.

A terceira solução funcionaria no meu caso, já que o pipe fará parte de um pipeline com uma MAD especificada pelo usuário (IO) que não deve se preocupar com os erros de análise (ele analisará os dados da rede em um formato entregue a um usuário). tipo especificado). Mas não parece tão elegante assim, e, de novo, (possivelmente?) Resultaria em muitos livros guardados uma vez usados ​​em qualquer outro contexto.

Eu realmente não pensei na solução final, mas parece algo complicado.

Eu ficaria grato por qualquer pensamento sobre este caso em particular (eu não ficaria surpreso se eu estivesse longe e perdesse algo óbvio), e por quaisquer referências (mais ou menos relevantes) a discussões sobre manipulação de erros em pipes ( -core) / condutas / interatee etc

EDIT: Outra possibilidade pode ser a de tomar apenas uma ação monádica (em vez de um cano completo), embora eu não tenha certeza se poderia apenas generalizar, se especializar ou mesmo ser equivalente ao quarto.

questionAnswers(1)

yourAnswerToTheQuestion