0
我對Conduit的await :: Monad m => ConduitM i o m (Maybe i)
感興趣。Conduit的「等待」收到Maybe。爲什麼?以及如何?
任何人都可以解釋它爲什麼會發生,特別是我該如何yield
這樣一個可選的值,或者如何編寫一個可以做到這一點的生產者/源?
我對Conduit的await :: Monad m => ConduitM i o m (Maybe i)
感興趣。Conduit的「等待」收到Maybe。爲什麼?以及如何?
任何人都可以解釋它爲什麼會發生,特別是我該如何yield
這樣一個可選的值,或者如何編寫一個可以做到這一點的生產者/源?
一旦上游來源耗盡,await
管道將作爲結果開始返回Nothing
,並且從現在開始不會返回任何東西,而是返回Nothing
。它表明上游管道的終止,所以你可以做一些定案工作。
另一端yieldOr
指示下游宿/管道的終止。簡單的yield
實現爲\o -> yieldOr o (return())
,您可以用您的最終代碼替換return()
。
如果您尚未完成此管道的定型工作,則可以使用awaitForever
代替。
相當在座的各位可能已經在通過管道包的作家寫的教程總結的問題,我閱讀推薦首先:Conduit Overview
但有可能返回'Nothing'如果沒有價值_right現在_?因此,隨後的調用可以在值準備好時再次返回「Just」? –
@AlexeyRaga從根本上說,不是不可能的。幕後管道是向後工作的:你從最後的匯點詢問價值,匯點詢問上游管道/來源的價值等等。他們會互相等待。當沒有剩餘價值時,上游實際上會向下遊傳遞一個特殊的「無價值」指標,這樣他們就會知道他們不必再等待了。 – zakyggaps