我正在尝试将列表写入文件,稍后我也想将文件内容读入列表中。
所以我有一个这样的清单[" ABC"," DEF"]
我尝试过像
这样的事情hPrint fileHandle listName
这只会打印到文件"["ABC","DEF"]"
我已尝试过unlines
,但其打印方式与"ABC\nDEF\n"
现在在这两种情况下,我都无法回读正确的列表。输出文件有引号,因此当我阅读时,我得到这样的[" [" ABC"," DEF"]""]即列表中的单个字符串。
由于我没有成功,我尝试逐行编写列表,我尝试应用地图和函数来编写列表k = map (\x -> hPrint fileSLC x) fieldsBefore
,它没有做任何事情,文件是空白的。我想如果我把所有内容写成单独的行,我稍后就可以像(lines src)
那样阅读。
我知道我正在做的事情是错的,但我只是第二次在Haskell上编写代码,上次我只写了一个非常小的文件阅读程序。从命令式转向功能性并非易事。 :(
答案 0 :(得分:3)
尝试使用hPutStrLn
和unlines
代替hPrint
。 hPrint
内部调用show
会导致String
被引用和转义。
hPutStr fileHandle (unlines listName)
或者,使用mapM
或forM
。一个详细的例子是:
forM_ listName $ \string ->
hPutStrLn string
这可以简化(" eta-contract",在lambda-calculus术语中)
forM_ listName hPutStrLn
答案 1 :(得分:0)
如您所见,当您从文件中读取时,您会得到String
。要将此String
转换为列表,您需要解析它。
要使k = map (\x -> hPrint fileSLC x) fieldsBefore
生效,您需要使用mapM
或mapM_
代替map
。