我正在尝试扩展常规降价,使其能够引用其他文件,以便在“主”文件中的相应位置呈现被引用文件中的内容。
但我来的最远的是实施
createF :: FTree -> IO String
createF Null = return ""
createF (Node f children) = ifNExists f (_id f)
(do childStrings <- mapM createF children
withFile (_path f) ReadMode $ \handle ->
do fc <- lines <$> hGetContents handle
return $ merge fc childStrings)
ifNExists
只是一个可以忽略的助手,真正的问题发生在句柄的读取中,它只是返回空字符串,我认为这是由于惰性 IO。
我认为使用withFile filepath ReadMode $ \handle -> {-do stutff-}hGetContents handle
将是正确的解决方案,因为我读过fcontent <- withFile filepath ReadMode hGetContents
是一个坏主意。
让我感到困惑的另一件事是功能
createFT :: File -> IO FTree
createFT f = ifNExists f Null
(withFile (_path f) ReadMode $ \handle ->
do let thisParse = fparse (_id f :_parents f)
children <-rights . map ( thisParse . trim) . lines <$> hGetContents handle
c <- mapM createFT children
return $ Node f c)
奇迹般有效。
那么为什么createF
只返回一个空字符串呢?
整个项目和要测试的目录/文件可以在github上找到
这是数据类型定义
type ID = String
data File = File {_id :: ID, _path :: FilePath, _parents :: [ID]}
deriving (Show)
data FTree = Null
| Node { _file :: File
, _children :: [FTree]} deriving (Show)