Я хочу разобрать все файлы json в заданном каталоге в тип данных Result.
Итак, у меня есть функция декодирования
decodeResult :: Data.ByteString.Lazy.ByteString -> Maybe Result
Я начал с Data.Text.Lazy.IO для загрузки файла в Lazy ByteString,
import qualified Data.Text.Lazy.IO as T
import qualified Data.Text.Lazy.Encoding as T
getFileContent :: FilePath -> IO B.ByteString
getFileContent path = T.encodeUtf8 `fmap` T.readFile path
Он скомпилирован, но я столкнулся с проблемой открытия слишком большого количества файлов, поэтому я подумал, что, возможно, мне следует использовать withFile.
import System.IO
import qualified Data.ByteString.Lazy as B
import qualified Data.Text.Lazy.IO as T
import qualified Data.Text.Lazy.Encoding as T
getFileContent :: FilePath -> IO (Maybe Result)
getFileContent path = withFile path ReadMode $ \hnd -> do
content <- T.hGetContents hnd
return $ (decodeAnalytic . T.encodeUtf8) content
loadAllResults :: FilePath -> IO [Result]
loadAllResults path = do
paths <- listDirectory path
results <- sequence $ fmap getFileContent (fmap (path ++ ) $ filter (endswith ".json") paths)
return $ catMaybes results
В этой версии ленивый ввод-вывод никогда не оценивался, он всегда возвращает пустой список. Но если я печатаю содержимое внутри функции getFileContent, то все работает правильно.
getFileContent :: FilePath -> IO (Maybe Result)
getFileContent path = withFile path ReadMode $ \hnd -> do
content <- T.hGetContents hnd
print content
return $ (decodeAnalytic . T.encodeUtf8) content
Поэтому я не уверен, что мне не хватает, должен ли я использовать трубопровод для таких вещей?
loadAllResults
невероятно ленив - простое выполнениеloadAllResults x
на самом деле не читает файлы (или даже не открывает их). При попытке оценить получившийся список вы одновременно открываете все файлы и пытаетесь их прочитать.withFile
вам не поможет, потому что лень исходит изhGetContents
- попробуйте переключиться на неленивый текстовый ввод-вывод. - person user2407038   schedule 10.01.2017