特定のディレクトリ内のすべてのjsonファイルをデータ型の結果に解析します。DataText.Lazy.IOを使用してAesonでJSONファイルを解析する方法
だから、私はそれがコンパイルされ、私はに走った
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
、レイジー延ByteStringにファイルをロードするためにData.Text.Lazy.IOで始まったデコード機能に
decodeResult :: Data.ByteString.Lazy.ByteString -> Maybe Result
を持っていますファイルが多すぎると問題が発生したので、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
、怠惰なIOが評価やったことがなかった、それは常に空のリストを返すようです。しかし、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'を実行しても実際にはファイルが読み込まれません。結果リストを評価しようとすると、同時にすべてのファイルを開き、それらを読み込もうとします。怠惰が 'hGetContents'から来ているので、' withFile'はあなたを助けません。 - 怠惰なテキストIOに切り替えてみてください。 – user2407038