Я начинаю Хаскелл, пытаясь обернуть голову вокруг библиотеки кабелепроводов.Как пронумеровать строки, считанные из файла, используя кабелепроводы?
Я пытался что-то вроде этого, но он не компилируется:
import Data.Conduit
import Data.Conduit.Binary as CB
import Data.ByteString.Char8 as BS
numberLine :: Monad m => Conduit BS.ByteString m BS.ByteString
numberLine = conduitState 0 push close
where
push lno input = return $ StateProducing (lno + 1) [BS.pack (show lno ++ BS.unpack input)]
close state = return state
main = do
runResourceT $ CB.sourceFile "wp.txt" $= CB.lines $= numberLine $$ CB.sinkFile "test.txt"
кажется, что государство в conduitState должны быть того же типа, что и тип входного трубопровода в. Или, по крайней мере, это то, что я понимаю из сообщения об ошибке:
$ ghc --make exp.hs
[1 of 1] Compiling Main (exp.hs, exp.o)
exp.hs:8:27:
Could not deduce (Num [ByteString]) arising from the literal `0'
from the context (Monad m)
bound by the type signature for
numberLine :: Monad m => Conduit ByteString m ByteString
at exp.hs:(8,1)-(11,30)
Possible fix:
add (Num [ByteString]) to the context of
the type signature for
numberLine :: Monad m => Conduit ByteString m ByteString
or add an instance declaration for (Num [ByteString])
In the first argument of `conduitState', namely `0'
In the expression: conduitState 0 push close
In an equation for `numberLine':
numberLine
= conduitState 0 push close
where
push lno input
= return
$ StateProducing (lno + 1) [pack (show lno ++ unpack input)]
close state = return state
Как это можно сделать с помощью кабелепроводов? Я хочу прочитать строки из файла и добавить номер строки в каждую строку.
Спасибо! Я должен был больше обратить внимание на типы. – donatello