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)”“数据