如果您需要该类型签名,那么我建议您这样做:
import Control.Foldl (mconcat, purely)
import Data.ByteString (ByteString)
import Data.Text (unpack)
import Lens.Family (view)
import Pipes (Producer, (>->))
import Pipes.Group (folds)
import qualified Pipes.Prelude as Pipes
import Pipes.Text (lines)
import Pipes.Text.Encoding (utf8)
import Prelude hiding (lines)
getLines
:: Producer ByteString IO r -> Producer String IO (Producer ByteString IO r)
getLines p = purely folds mconcat (view (utf8 . lines) p) >-> Pipes.map unpack
这是有效的,因为类型purely folds mconcat
是:
purely folds mconcat
:: (Monad m, Monoid t) => FreeT (Producer t m) r -> Producer t m r
...t
在这种情况下将是Text
:
purely folds mconcat
:: Monad m => FreeT (Producer Text m) r -> Producer Text m r
任何时候你想减少你可能想要使用Producer
的 -delimited 流的每个子组。那么这只是选择减少子组的权利的问题。在这种情况下,您只想连接组中的所有块,因此您传入. 我通常不建议这样做,因为它会在非常长的行上中断,但您指定您需要这种行为。FreeT
purely folds
Fold
Text
mconcat
这很冗长的原因是因为pipes
生态系统Text
过度推广String
并且还试图鼓励处理任意长的行。如果您不受其他代码的限制,那么更惯用的方法就是:
view (utf8 . lines)