Dre*_*rew 3 haskell parsec lazy-evaluation lazy-io
我试图在Parsec一大堆小文件上运行一个解析器,并收到一条错误,说我有太多打开的文件.我知道我需要使用严格的IO,但我不知道该怎么做.这是有问题的代码:
files = getDirectoryContents historyFolder
hands :: IO [Either ParseError [Hand]]
hands = join $ sequence <$> parseFromFile (many hand) <<$>> files
Run Code Online (Sandbox Code Playgroud)
注意:我的<<$>>功能是这样的:
(<<$>>) :: (Functor f1, Functor f2) => (a -> b) -> f1 (f2 a) -> f1 (f2 b)
a <<$>> b = (a <$>) <$> b
Run Code Online (Sandbox Code Playgroud)
我现在不知道你的parseFromFile功能是什么样子(可能在问题中包含它可能是一个好主意),但我猜你正在使用Prelude.readFile,正如@Markus1189指出的那样包括懒惰的I/O. 要获得严格的I/O,您只需要一个严格的readFile,例如Data.Text.IO.readFile.
流式数据库喜欢pipes或conduit将允许您一次性避免将整个文件读入内存,但据我所知,parsec不提供允许这种情况发生的流式接口.另一方面,attoparsec确实包括这样的流接口,并且管道和管道都具有attoparsec适配器库(例如,Data.Conduit.Attoparsec).
tl; dr:您可能只需要以下辅助函数:
import qualified Data.Text as T
import qualified Data.Text.IO as TIO
readFileStrict :: FilePath -> IO String
readFileStrict = fmap T.unpack . TIO.readFile
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
724 次 |
| 最近记录: |