Можно исправить несоответствие типов, используя bs
в качестве второго параметра для splitAt
import qualified Data.ByteString.Streaming.Char8 as BSSC
main :: IO ()
main = runResourceT $ dump $ BSSC.readFile "filename"
dump :: (MonadIO m) => BSSC.ByteString m r -> m ()
dump bs = do
len :> bs2 <- BSSC.length bs
if len <= 1 then return ()
else dump $ BSSC.putStr $ BSSC.splitAt 1 bs
но это не сработает, как вы ожидаете. Я предполагаю, что он будет читать файл столько раз, сколько букв в нем.
Если вы хотите рекурсию, вы должны пойти с
import qualified Data.ByteString.Streaming.Char8 as BSSC
main :: IO ()
main = runResourceT $ dump $ BSSC.readFile "filename"
dump :: (MonadIO m) => BSSC.ByteString m r -> m ()
dump bs = do
split <- BSSC.uncons bs
case split of
Left _ -> return ()
Right (x, xs) -> putStr (show x) >> dump xs
У меня нет компилятора, поэтому, возможно, в моих фрагментах есть проблемы компиляции.