2012-04-02 64 views
33

Tôi muốn nghe từ một người hiểu biết sâu sắc hơn bản thân sự khác biệt cơ bản giữa Enumerators, ConduitsPipes cũng như những lợi ích và hạn chế chính. Một số discussion's alreadyongoing nhưng thật tuyệt khi có cái nhìn tổng quan cấp cao.Ưu điểm và nhược điểm của Điều tra so với Ống so với Ống là gì?

+4

Ống dẫn và đường ống vẫn đang trong quá trình sửa đổi nặng, do đó khó so sánh và tương phản cho đến khi chúng ổn định. Trong tình hình lý tưởng, ống dẫn và đường ống sẽ hợp nhất vào The Way đúng để làm điều tra viên. –

Trả lời

28

Điều tra viên/Lặp lại như là một sự trừu tượng được phát minh bởi Oleg Kiselyov. Chúng cung cấp một cách làm sạch IO với các yêu cầu tài nguyên có thể dự đoán được (thấp). Gói Enumerators hiện tại khá gần với tác phẩm gốc của Oleg.

Ống dẫn được tạo cho khung công tác web Yesod. Sự hiểu biết của tôi là chúng được thiết kế để có tốc độ cực nhanh. Các phiên bản ban đầu của thư viện có tính chất rất cao.

Ống tập trung vào sự sang trọng. Họ chỉ có một loại thay vì một số, hình thức monad (biến áp) và thể loại trường hợp, và rất "chức năng" trong thiết kế.

Nếu bạn thích giải thích phân loại: loại Pipe chỉ là đơn nguyên miễn phí qua các functor đơn giản không tin kính sau

data PipeF a b m r = M (m r) | Await (a -> r) | Yield b r 
instance Monad m => Functor (PipeF a b m) where 
    fmap f (M mr) = M $ liftM mr 
    fmap f (Await g) = Await $ f . g 
    fmap f (Yield b p) = Yield b (f p) 
--Giving: 
newtype Pipe a b m r = Pipe {unPipe :: Free (PipeF a b m) r} 
    deriving (Functor, Applicative, Monad) 

--and 
instance MonadTrans (Pipe a b) where 
    lift = Pipe . inj . M 

Trong định nghĩa đường ống thực tế chúng được nướng trong, nhưng sự đơn giản của định nghĩa này là tuyệt vời. Ống tạo thành một thể loại dưới sự vận hành (<+<) :: Monad m => Pipe c d m r -> Pipe a b m r -> Pipe a d m r lấy bất cứ ống nào đầu tiên yields và nạp nó vào ống chờ thứ hai.

Có vẻ như Conduits đang chuyển sang nhiều hơn Pipe như (sử dụng CPS thay vì trạng thái và chuyển sang một loại) trong khi Ống đang hỗ trợ xử lý lỗi tốt hơn và có thể trả lại các loại riêng biệt cho máy phát điện và người tiêu dùng .

Khu vực này đang chuyển động nhanh chóng. Tôi đã hack vào một biến thể thử nghiệm của thư viện Pipe với những tính năng này, và biết những người khác là tốt (xem gói ống Guarded trên Hackage), nhưng nghi ngờ rằng Gabriel (tác giả của Pipes) sẽ tìm ra trước khi tôi làm.

Đề xuất của tôi: nếu bạn đang sử dụng Yesod, hãy sử dụng Ống dẫn. Nếu bạn muốn một thư viện trưởng thành sử dụng Enumerator. Nếu bạn chủ yếu quan tâm đến sự sang trọng, hãy sử dụng Pipe.

7

Sau khi viết các ứng dụng với cả ba thư viện, tôi nghĩ sự khác biệt lớn nhất mà tôi đã thấy là cách xử lý tài nguyên. Ví dụ, Pipes phá vỡ hoàn thành tài nguyên thành các loại Khung và Ngăn xếp riêng biệt.

Dường như vẫn có một số cuộc tranh luận về cách không chỉ hoàn thành tài nguyên đầu vào mà còn có khả năng là tài nguyên đầu ra. Ví dụ, nếu bạn đang đọc từ một DB và ghi vào một tập tin, kết nối cho DB cần phải được đóng lại cũng như các tập tin đầu ra cần phải được flushed và đóng cửa. Những điều có được lông khi quyết định làm thế nào để xử lý trường hợp ngoại lệ và trường hợp thất bại dọc theo đường ống.

Một sự khác biệt tinh tế hơn dường như là cách giá trị trả về của đường ống điều tra được xử lý và tính toán.

Rất nhiều sự khác biệt này và những mâu thuẫn tiềm năng đã bị phơi bày bởi việc sử dụng triển khai Đơn vị và Danh mục cho Ống và hiện đang đi vào Ống dẫn.

Các vấn đề liên quan