У меня есть следующие компоненты трубопровода, которые сплавляются вместе:
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? Вероятно, мне следует подождать, чтобы посмотрите на это после того, как выспитесь, но мне было очень любопытно об этом ...
ConduitM
, но, по-видимому,type ConduitM = ConduitT
, так что проблема не в этом. - person bbarker   schedule 26.09.2019runConduit
(и всеми его вариантами), ожидающими()
во входной позиции, и, соответственно, у меня нет источника, который бы имел единицу во входной позиции, как сейчас написано .... хм - person bbarker   schedule 26.09.2019