Я пытаюсь создать бесконечный ленивый поток значений из IO, завернутый WriterT. Я использую каналы, чтобы потреблять этот поток и записывать его в файл. Я хорошо знаю строгость IO в своем операторе привязки, так как я могу создать этот поток лениво, имея там IO?ленивое вычисление внутри IO monad
Если это невозможно, следует ли попытаться перейти на ленивый ST?
import Data.Conduit
import Control.Monad.Writer
import Data.DList as DL
type Stream = WriterT (DL.DList String) IO()
generator :: Stream
generator = do
tell $ DL.singleton "something"
generator
runStream :: Stream -> IO()
runStream s = runResourceT $ stream s
where stream s = sourceStream s $$ sinkStream -- sinkStream just writes to a file
sourceStream s = do w <- liftIO $ execWriterT s
CL.sourceList (DL.toList w)
Да, почему бы просто не использовать ленивый IO? –
Почему вы просто не переписываете свой генератор как «Source IO String»? –
@DonStewart Я просто хочу возиться с каналами, чтобы увидеть, насколько хорошо подходит IO :-) – Ricardo