Thư viện Pipes.Aeson cho thấy nhiều chức năng sau:Truyền phân tích cú pháp của JSON trong Haskell với Pipes.Aeson
decode :: (Monad m, ToJSON a) => Parser ByteString m (Either DecodingError a)
Nếu tôi sử dụng evalStateT với phân tích cú pháp này và một tập tin xử lý như một cuộc tranh cãi, một đối tượng JSON duy nhất là đọc từ tệp và phân tích cú pháp.
Sự cố là tệp chứa một số đối tượng (tất cả cùng loại) và tôi muốn gấp hoặc giảm chúng khi chúng được đọc.
Pipes.Parse cung cấp:
foldAll :: Monad m => (x -> a -> x) -> x -> (x -> b) -> Parser a m b
nhưng như bạn có thể thấy điều này trả về một phân tích cú pháp mới - Tôi không thể nghĩ ra một cách để cung cấp các phân tích cú pháp đầu tiên là một cuộc tranh cãi.
Dường như một trình phân tích cú pháp thực sự là một Nhà sản xuất trong một biến áp đơn vị StateT. Tôi tự hỏi liệu có cách nào để giải nén Nhà sản xuất khỏi StateT để evalStateT có thể được áp dụng cho foldAll Parser hay không, và nhà sản xuất từ bộ giải mã phân tích cú pháp.
Đây có lẽ là cách tiếp cận sai hoàn toàn.
Câu hỏi của tôi, viết tắt:
Khi phân tích cú pháp tệp bằng Pipes.Aeson, cách tốt nhất để gấp tất cả các đối tượng trong tệp là gì?
Bạn cũng có thể thực hiện 'zoom decoded (foldAll step begin done)' –
@GabrielGonzalez Ah vâng, tôi quên một người cũng có thể sử dụng 'zoom' để áp dụng ống kính cho 'Parser'. – danidiaz
@GabrielGonzalez Ngoài ra, có vẻ như sử dụng 'zoom decoded ...' làm cho các lỗi phân tích cú pháp dễ xử lý hơn. – danidiaz