Haskell 使用 show 递归地将值组合成字符串

Haskell combining values into string using show, recursivly

writer :: DataBase -> IO ()
writer [] = writeFile "output.txt" ""
writer xs = writeFile "output.txt"  (createOutput xs)

createOutput :: DataBase -> String
createOutput [] = ""
createOutput (x:xs) = (show (get1 x)++", "++ (get2 x)++", "++(get3 x)++", "++show(get4 x) ++", "++show(get5 x)++", "++show(get6 x)++"\n") : createOutput xs

createOutput

末尾的递归调用
 : createOutput xs

破坏了我的功能,它在没有递归的情况下工作正常,但我不能递归地执行它,这就是重点。我想做的是从 "Custom" 数据类型中获取值,它基本上是一个元组列表和 get1 get2 等,获取元组中的第一个第二个等等元素

type Id = Integer
type Song = String
type Group = String
type Year = Integer
type Length = Integer
type Rate = Rational

type Data = (Id, Song, Group, Year, Length, Rate)
type DataBase = [Data]
get1 (a1, _, _, _, _, _) = a1
get2 (_, a2, _, _, _, _) = a2
get3 (_, _, a3, _, _, _) = a3
get4 (_, _, _, a4, _, _) = a4
get5 (_, _, _, _, a5, _) = a5
get6 (_, _, _, _, _, a6) = a6

我正在使用 show 将非字符串变量转换为字符串,但是当我试图使函数以递归方式调用它时,一切都崩溃了,我尝试在周围添加一堆括号,或者不使用 show,但即便如此,仅用一个 get 语句,它就会分裂,老实说,我不明白为什么...

我知道我可以用 writeFile "output.txt" (show xs) 打印文件,但它没有产生我想要的输出,每个元组没有引号和换行符

看来您需要在 createOutput 递归调用结束时再次使用附加 (++) 而不是缺点 (:)。

考虑类型,++ 连接两个 String(形式上等于 CharsList),而 : 添加一个 Char 到字符串的开头。

这可以通过它们的类型签名得到更正式的认可:

(++) :: [a] -> [a] -> [a]
(:) :: a -> [a] -> [a]