Performance Haskell-不使用方括号将数组写入文件
在我的程序中,我生成一个数字列表:Performance Haskell-不使用方括号将数组写入文件,performance,haskell,io,linked-list,Performance,Haskell,Io,Linked List,在我的程序中,我生成一个数字列表: data = [2,3,2,5,2,7,2,3,2,11 ... ] 现在我想把这个数字列表作为一个单行逗号分隔的字符串写在一个文件中。我知道我可以将writeFile与Show结合使用: writeFile "data.txt" $ show $ data 但是,这也会打印开头和结尾的方括号。现在,我可以使用reverse从字符串Show data中删除第一个和最后一个字符,但这样做效率很低。在某些情况下,程序已经在遍历列表以便将字符写入文件,因此如何确
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]
插入
来自数据。列表
(顺便说一句:你不能调用变量
data
,因为那是一个关键字)你所拥有的很好,但我认为一个更简洁的方法不是在列表上使用show
,而是显示每个元素并自己加逗号,如下所示:
writeFile "data.txt" . intercalate "," . map show $ [1, 2, 3]
插入
来自数据。列表
(顺便说一句:你不能调用变量
data
,因为那是一个关键字)你有很多方法可以做到这一点!您的数据将转换为字符串,现在您可以使用它们:
在您的情况下,您可以这样编写代码(列表中的每个元素被读取一次并直接转换)
writeFile“data.txt”$data.List.foldl(\x y->x++显示y++“,”)数据
没有最后一个逗号:
writeFile“data.txt”$data.List.tail$data.List.foldl(\x y->x++),“++show y)”数据
或者使用数据插入。列表
Data.List.interlate“,”$Data.List.map(\x->show x)数据
stackoverflow上也有类似的问题:
- 你有很多方法可以做到这一点!您的数据将转换为字符串,现在您可以使用它们:
在您的情况下,您可以这样编写代码(列表中的每个元素被读取一次并直接转换)
writeFile“data.txt”$data.List.foldl(\x y->x++显示y++“,”)数据
没有最后一个逗号:
writeFile“data.txt”$data.List.tail$data.List.foldl(\x y->x++),“++show y)”数据
或者使用数据插入。列表
Data.List.interlate“,”$Data.List.map(\x->show x)数据
stackoverflow上也有类似的问题:
数据的。在编写伪代码时没有考虑到这一点。对,您是关于数据的。在编写伪代码时没有考虑到这一点。很好。请注意,折叠方法将生成尾随逗号,而插入方法不会。是的,对不起,这里的解决方案:Data.List.tail$Data.List.foldl(\x y->x++>,“++show y)”“Data
foldl
在这里是一个错误的选择。在ghci的[1..1000000]
上尝试它,并观看它的爬行。您正在强制(++)
与左侧关联,这使得它重复遍历“1”
,然后“1,2”
,然后“1,2,3”
等等。使用foldr
。如果我这样做Data.List.foldr(\x y->“,“++show x++y)”“数据
Nice。请注意,折叠方法将生成尾随逗号,而插入方法不会。是的,对不起,这里的解决方案:Data.List.tail$Data.List.foldl(\x y->x++>,“++show y)”“Data
foldl
在这里是一个错误的选择。在ghci的[1..1000000]
上尝试它,并观看它的爬行。您正在强制(++)
与左侧关联,这使得它重复遍历“1”
,然后“1,2”
,然后“1,2,3”
等等。使用foldr
。如果我这样做Data.List.foldr(\x y->“,“++show x++y)”“数据