首页 > 解决方案 > 如何在 Haskell 中将值列表显示为逗号分隔的字符串列表

问题描述

在 writeFile 之后,我需要从最后一个列表中删除一个逗号。如何专门从列表中删除逗号?

Expected output

[Spa"24""Meta""Outram"1[("Colin",4),("Nixon",6),("Sam",5),("Petrina",7),("Justin",5)],

Spa"25""Zen""Outram"2[("Bryan",7),("Petrina",9),("Colin",4),("Nixon",7),("Sam",5)]]
Output achieved 

[Spa"24""Meta""Outram"1[("Colin",4),("Nixon",6),("Sam",5),("Petrina",7),("Justin",5)],

Spa"25""Zen""Outram"2[("Bryan",7),("Petrina",9),("Colin",4),("Nixon",7),("Sam",5)],]

-- turn original spa into String
spaStr :: Spa -> String
spaStr spa@(Spa rid br ar st s)
    = "Spa" ++ "\""++ rid ++ "\"" ++ "\"" ++ br ++ "\""++ "\""++ ar ++ "\"" ++ show st  ++ show s ++ "," ++"\n"

let newdB = ((addTspa rid br ar (read st))dB)
putStrLn $ spaStr newdB
writeFile "spa.txt" ("[" ++ spaStr newdB ++ "]")

标签: haskell

解决方案


正如评论中所建议的,一种可能的方法是:

  • [Spa][String]不添加任何逗号或换行符的情况下转至。这将生成一个列表,如["aaa", "bbb", "ccc"]
  • 在该列表上使用intersperse ",\n"可将该分隔符添加到相邻元素的中间。这不会将分隔符添加到末尾。你会得到类似的东西["aaa", ",\n", "bbb", ",\n", "ccc"]
  • concat在结果上使用,得到"aaa,\nbbb,\nccc".
  • 添加最后的[]

这是一个运行并产生您想要的输出的示例:

import Data.List (intersperse)

data Spa = Spa String String String Int [(String, Int)]

-- turn original spa into String
spaStr :: Spa -> String
spaStr spa@(Spa rid br ar st s)
    = "Spa" ++ "\""++ rid ++ "\"" ++ "\"" ++ br ++ "\""++ "\""++ ar ++ "\"" ++ show st  ++ show s

newDb :: [Spa]
newDb =
   [ Spa "24" "Meta" "Outram" 1
     [("Colin",4),("Nixon",6),("Sam",5),("Petrina",7),("Justin",5)]
   , Spa "25" "Zen" "Outram" 2
     [("Bryan",7),("Petrina",9),("Colin",4),("Nixon",7),("Sam",5)]
   ]

main :: IO ()
main =
    putStrLn $ "[" ++ concat (intersperse ",\n" $ map spaStr newDb) ++ "]"

输出:

[Spa"24""Meta""Outram"1[("Colin",4),("Nixon",6),("Sam",5),("Petrina",7),("Justin",5)],
Spa"25""Zen""Outram"2[("Bryan",7),("Petrina",9),("Colin",4),("Nixon",7),("Sam",5)]]

推荐阅读