如何在列表中显示所有元组数据(使用递归)

时间:2011-06-11 15:09:31

标签: haskell

想象一下,我有一个像

这样的元组列表
 [("Fazaal","Naufer",07712345678)
            ,("Tharanga","Chandasekara",0779876543)
            ,("Ruaim","Mohomad",07798454545)
            ,("Yasitha","Lokunarangoda",07798121212)
            ,("Rochana","Wimalasena",0779878787)
            ,("Navin","Dhananshan",077987345678)
            ,("Akila","Silva",07798123123)
            ,("Sudantha","Gunawardana",0779812456)
            ] 

我想在这里展示每个元组。 我尝试了这段代码,但它混淆了格式。

displayDB           :: [Reservation] ->String 
displayDB []        =   []
displayDB (x :xs)   =   show x ++ show( displayDB (xs))

2 个答案:

答案 0 :(得分:1)

考虑较小输入端会发生什么。每一行都是一个扩展:

displayDB [("A", "B", 1), ("C", "D", 2)]
=> show ("A", "B", 1) ++ show (displayDB [("C", "D", 2)])
=> show ("A", "B", 1) ++ show (show ("C", "D", 2) ++ show (displayDB []))
=> show ("A", "B", 1) ++ show (show ("C", "D", 2) ++ show [])

答案 1 :(得分:1)

首先,您在“displayDB”的字符串输出上调用“show”。你的最后一行应该是

displayDB (x :xs)   =   show x ++ displayDB xs

您的版本将导致每个连续的元组被包含在另一个字符串转义层中,因此您将逐步进行更复杂的转义。

其次,“show x”将以最明显和最基本的方式将元组转换为字符串。您可能希望比以更好的方式发出字段的功能更好,并且您还需要根据需要插入逗号或换行符。不知道你想要什么,这个输出有点难以分辨。

第三,写一个你自己的递归函数是不好的风格(除非你把它写成一个练习);更好的风格是组合像“地图”这样的功能。表达式

map show xs

会将元组列表转换为字符串列表。然后,您可以打印这些字符串或使用Data.List中的“intercalate”将此字符串列表转换为单个字符串,并在元素之间放入正确的位。所以你可能想要像

这样的东西

displayDB xs = intercalate“,\ n”$ map show xs

或者如果您喜欢无点形式:

displayDB = intercalate“,\ n”。地图秀