繁体   English   中英

Haskell:将元组列表作为字符串输出输出

[英]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 ”内部列表, mapfoldL (并且取决于您的需求,也许sortBy )将很有帮助。 如果有这个,构造输出就很简单了(使用show ,正如您已经提到的)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM