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
(形式上等于 Chars
的 List
),而 :
添加一个 Char
到字符串的开头。
这可以通过它们的类型签名得到更正式的认可:
(++) :: [a] -> [a] -> [a]
(:) :: a -> [a] -> [a]
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
(形式上等于 Chars
的 List
),而 :
添加一个 Char
到字符串的开头。
这可以通过它们的类型签名得到更正式的认可:
(++) :: [a] -> [a] -> [a]
(:) :: a -> [a] -> [a]