我有一个元组列表。例如:[("A",100,1),("B",101,2)]
。我需要以简单的方式显示它。例如:"your name is: A", "Your id is: 100"
。
如果有人能找到解决方案,那将是一个很大的帮助。提前谢谢。
答案 0 :(得分:6)
最简单的方法是创建一个适用于列表中某个元素的函数。所以你需要这样的东西:
showDetails :: (String, Int, Int) -> String
showDetails (name, uid, _) = "Your name is:" ++ name ++ " Your ID is: " ++ show uid
然后您将此函数应用于列表中的每个元素,这意味着您要使用映射函数:
map :: (a -> b) -> [a] -> [b]
因此,如果您的列表名为xs
,则需要以下内容:
map showDetails xs
这显然会为您提供[String]
类型的结果,因此您可能对unlines
函数感兴趣:
unlines :: [String] -> String
这只是一个字符串列表,并创建一个字符串,其中每个元素由一个新行分隔。
将这些全部放在一起,然后,给你:
main :: IO ()
main = putStrLn . unlines . map showDetails $ [("A",100,1),("B",101,2)]
答案 1 :(得分:1)
对于单个元组,只需模式匹配所有元素,并对它们执行某些操作。拥有执行此操作的功能,您可以使用map
转换整个列表。
import Data.List (foldl')
show_tuple :: (Num a, Num b) => (String, a, b) -> String
show_tuple (name, id, something) =
"Your name is: " ++ name ++ "\n" ++
"Your ID is: " ++ (show id) ++ "\n" ++
"Your something: " ++ (show something) ++ "\n\n"
-- transforms the list, and then concatenates it into a single string
show_tuple_list :: (Num a, Num b) => [(String, a, b)] -> String
show_tuple_list = (foldl' (++) "") . (map show_tuple)
输出:
*Main Data.List> putStr $ show_tuple_list [("ab", 2, 3), ("cd", 4, 5)]
Your name is: ab
Your ID is: 2
Your something: 3
Your name is: cd
Your ID is: 4
Your something: 5
答案 2 :(得分:0)
快速而肮脏的解决方案
f (x,y,z) = "your id is " ++ (show y) ++ ", your name is " ++ (show x) ++ "\n"
main = putStrLn $ foldr (++) "" (map f [("A",100,1),("B",101,2)])
或(由@maksenov提供)
main = putStrLn $ concatMap f [("A",100,1),("B",101,2)]