在我的程序中,我生成一个数字列表:
data = [2,3,2,5,2,7,2,3,2,11 ... ]
现在我想把这个数字列表写成一个单行逗号分隔的字符串在文件中。我知道我可以将writeFile
与Show
结合使用:
writeFile "data.txt" $ show $ data
但是,这也将打印开头和结尾的方括号。现在我可以通过使用reverse
从字符串Show data
中删除第一个和最后一个字符,但这是低效的。在某些时候,程序已经遍历列表以便将字符写入文件,那么我如何确保它在不进行不必要的遍历的情况下不写入第一个和最后一个字符呢?
这样做最有效吗?
writeFile "data.txt" $ drop 1 $ takeWhile (c -> c/= ']') $ show data
你有什么是好的,但我认为一个更整洁的方式是不使用show
的列表,而是显示每个元素,并把逗号自己,像这样:
writeFile "data.txt" . intercalate "," . map show $ [1, 2, 3]
intercalate
来自Data.List
。
(顺便说一下:你不能调用一个变量data
,因为那是一个关键字)
您有很多方法可以做到这一点!您的数据被转换为字符串,现在您可以使用它们:
在您的情况下,您可以这样编写代码(列表中的每个元素都读取一次并直接转换)
writeFile "data.txt" $ Data.List.foldl (x y -> x ++ show y ++ ",") "" data
且不加最后逗号:
writeFile "data.txt" $ Data.List.tail $ Data.List.foldl (x y -> x ++ "," ++ show y) "" data
或使用intercalate from Data。
列表 Data.List.intercalate "," $ Data.List.map (x -> show x) data
类似的问题在stackoverflow:
- 是否有任何haskell函数连接列表与分隔符?