У меня есть следующие компоненты трубопровода, которые сливаются вместе:
awaitVals () :: ConduitT (Element mono) (Element mono) m ()
intermTmp :: forall o. (Element mono -> Bool) -> ConduitT (Element mono) o m ([Element mono])
Слияние происходит следующим образом: awaitVals () .| intermTmp curPred
.
В соответствии с функцией предохранителя (.|
),Я думаю, что типы должны быть в порядке здесь.Предохранитель:
(.|) :: Monad m
=> ConduitT a b m ()
-> ConduitT b c m r
-> ConduitT a c m r
Вот полное определение функции:
takeWhileGrouped :: forall m mono. (Monad m, MonoFoldable mono) =>
([Element mono -> Bool])
-> ConduitT (Element mono) [Element mono] m ()
takeWhileGrouped preds = go preds
where
go (curPred:nextPreds) = yieldM (goIter curPred) >> go nextPreds
go [] = yield []
intermTmp :: forall o. (Element mono -> Bool) -> ConduitT (Element mono) o m ([Element mono])
intermTmp curPred = CC.takeWhile curPred .| sinkList
goIter :: (Element mono -> Bool) -> m ([Element mono])
goIter curPred =
(awaitVals () :: ConduitT (Element mono) (Element mono) m ())
.| (intermTmp curPred) & runConduit
awaitVals :: forall a m. Monad m => () -> ConduitT a a m ()
awaitVals _ = do
nextValMay <- await
case nextValMay of
Just val -> do
yield val
awaitVals ()
Nothing -> pure ()
И вот ошибка:
• Couldn't match type ‘Element mono’ with ‘()’
Expected type: ConduitM () () m ()
Actual type: ConduitT (Element mono) (Element mono) m ()
• In the first argument of ‘(.|)’, namely
‘(awaitVals () :: ConduitT (Element mono) (Element mono) m ())’
In the first argument of ‘(&)’, namely
‘(awaitVals () :: ConduitT (Element mono) (Element mono) m ())
.| (intermTmp curPred)’
In the expression:
(awaitVals () :: ConduitT (Element mono) (Element mono) m ())
.| (intermTmp curPred)
& runConduit
• Relevant bindings include
curPred :: Element mono -> Bool
(bound at src/FDS/Data/Conduits.hs:151:12)
goIter :: (Element mono -> Bool) -> m [Element mono]
(bound at src/FDS/Data/Conduits.hs:151:5)
intermTmp :: forall o.
(Element mono -> Bool)
-> ConduitT (Element mono) o m [Element mono]
(bound at src/FDS/Data/Conduits.hs:149:5)
preds :: [Element mono -> Bool]
(bound at src/FDS/Data/Conduits.hs:144:18)
takeWhileGrouped :: [Element mono -> Bool]
-> ConduitT (Element mono) [Element mono] m ()
(bound at src/FDS/Data/Conduits.hs:144:1)
|
151 | goIter curPred = (awaitVals () :: ConduitT (Element mono) (Element mono) m ()) .| (intermTmp curPred) & runConduit
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Я не понимаю, почему ожидаемыйТип не согласуется с фактическим типом.Вот более общий вопрос, который я не полностью завершил, но у него есть рабочее решение ближе к концу (но он не использует плавкий предохранитель для создания каналов на самом внешнем уровне): Как реализовать takeWhile-как функция с использованием комбинаторов Conduit? Вероятно, мне стоит подождать, чтобы посмотреть на это после того, как я поспал достаточно, но мне было очень любопытно по этому поводу ...