2011-12-29 21 views
9

Tuyên bố từ chối: điều này được hỏi gần đây trong danh sách quán cà phê haskell. Lời xin lỗi của tôi cho bất cứ ai làm phiền bởi bài đăng kép.Soạn thư liệt kê trong Điều tra viên

Tất cả các gói iteratee-thực hiện mà tôi biết (ví dụ iteratee, iterIO, và conduit) xác định một chức năng thành phần enumeratee, trừ gói enumerator. Điều này dường như đối với tôi giống như một giới hạn nghiêm trọng, nhưng cũng có vẻ tương đối đơn giản để thực hiện:

import Data.Enumerator 
import Data.Enumerator.Internal 

(=$=) :: Monad m 
     => Enumeratee a0 a1 m (Step a2 m b) -> Enumeratee a1 a2 m b 
     -> Enumeratee a0 a2 m b 
(=$=) e01 e12 step = Iteratee $ do 
    step' <- runIteratee $ e12 step 
    runIteratee . joinI $ e01 step' 

Có một số bản ghi nhớ ở đây mà tôi đang thiếu không? Hoặc một số lý do khác cho enumerator không phải để xác định thành phần enumeratee?

+0

Tôi đã gửi email cho tác giả/người duy trì [gói điều tra] (http://hackage.haskell.org/package/enumerator), John Millikin, liên kết anh ta với câu hỏi này. –

Trả lời

2

Hiện tại, bản phát hành mới (0.4.17) là enumerator bao gồm nhà điều hành (=$=) có chữ ký tôi đã nêu ở trên. Tôi đã gửi email cho tác giả của gói và anh ta tạo ra một trường hợp tốt chống lại bao gồm rất nhiều toán tử đơn giản (như ($=), (=$) và bây giờ là (=$=)) trong gói.

Về cơ bản, sự cố là xử lý dữ liệu nhập trên trái. Các joinI combinator

joinI :: Monad m => Iteratee a m (Step a' m b) -> Iteratee a m b 

vứt bỏ bên trái giao Stream a' đó là mang lại bởi liên kết nội Iteratee. Đây không phải là vấn đề nếu một người sử dụng kiểu như

joinI (foo $$ (bar $$ baz)) 

nơi dữ liệu còn lại chỉ bị hủy ở cuối tính toán. Tuy nhiên, việc sử dụng các toán tử được đơn giản hóa sẽ dẫn đến nhiều lần kết nối ngầm và dữ liệu còn lại sẽ trở nên khó khăn hơn để theo dõi. Nếu các iterate được sử dụng rất đơn giản (nghĩa là chúng không mang lại dữ liệu còn thừa) thì đây không phải là vấn đề và các toán tử được đơn giản hóa có ý nghĩa khi sử dụng.