[英]Haskell: Output list of tuples as string output
我正在尝试获取此元组列表:
[(2,"a"), (1,"a"), (1,"b"), (1,"c"), (2,"dd")]
到这个字符串输出
a 1,2
b 1
c 1
dd 2
我假设我需要使用unzip和unlines函数。 但是我也看到了使用show函数生成整数字符串的一些解决方案。 有任何想法吗?
如果您有此列表:
pairs = [ ("a", [1,2]), ("b", [1]), ("c", [1]), ("dd", [2]) ]
那么您可以通过以下方式获得所需的输出:
putStrLn $ unlines [ x ++ " " ++ unwords (map show ys) | (x, ys) <- pairs ]
但您必须先弄清楚如何获取pairs
列表。
将问题分解为步骤。 您真正想做的是在第二个位置聚合所有具有相同字符串的元组,因此您将拥有一个类似
aggregate :: [(Int, String)] -> [([Int], String)]
因此,对于您的输入列表,您将获得输出
[([1, 2], "a"), ([1], "b"), ([1], "c"), ([2], "dd")]
你的提示是
aggregate items = someFunc (map (\(num, str) -> ([num], str)) items)
看看文件foldr
。 在您问有关foldr
的后续问题之前,可能有数百个stackoverflow答案显示了如何使用它,需要花一些时间弄清楚它,否则它将立即作为副本被关闭。
然后,您需要一个函数来将这种形式的单个元组转换为单个String
以便输出:
prettyPrint :: ([Int], String) -> String
prettyPrint (nums, str) = str ++ " " ++ joinWithComma (map show nums)
您必须亲自实现joinWithComma
。 然后,您需要计算该值并为聚合列表中的每个项目打印它,首选使用mapM_
和putStrLn
,因此您的main
可能看起来像
main :: IO ()
main = do
let inputList = [(2,"a"), (1,"a"), (1,"b"), (1,"c"), (2,"dd")]
mapM_ (putStrLn . prettyPrint) (aggregate inputList)
逐步进行工作。 您可以从groupBy
函数开始:
groupBy (\x y-> (snd x)==(snd y)) [(2,"a"), (1,"a"), (1,"b"), (1,"c"), (2,"dd")]
给你
[[(2,"a"),(1,"a")],[(1,"b")],[(1,"c")],[(2,"dd")]]
下一步将是“ foldL
”内部列表, map
和foldL
(并且取决于您的需求,也许sortBy
)将很有帮助。 如果有这个,构造输出就很简单了(使用show
,正如您已经提到的)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.