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

时间:2015-02-24 22:10:53

标签: string haskell file-io recursion

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

打破我的功能,没有递归就可以正常工作,但是我不能递归地执行它,这是重点。我想要做的是从“自定义”数据类型中获取值,该数据类型基本上是元组列表和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将非字符串变量转换为字符串,但是当我尝试以递归方式调用函数时,一切都崩溃了,我尝试添加一堆括号,或者不使用{{1但是,即便如此,只有一个show声明,它就会分崩离析,它真的让我想不起......

我知道我可以使用get打印文件,但它不会产生我想要的输出,它没有引号和每个元组的新行

1 个答案:

答案 0 :(得分:2)

看起来你需要在++递归调用结束时再次使用append(:)而不是cons(createOutput)。

考虑类型,++连接两个String s(正式等于List的{​​{1}}),而Chars添加:到字符串的开头。

这可以通过其类型签名更正式地识别出来:

Char