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
打印文件,但它不会产生我想要的输出,它没有引号和每个元组的新行
答案 0 :(得分:2)
看起来你需要在++
递归调用结束时再次使用append(:
)而不是cons(createOutput
)。
考虑类型,++
连接两个String
s(正式等于List
的{{1}}),而Chars
添加:
到字符串的开头。
这可以通过其类型签名更正式地识别出来:
Char