在Haskell中简化一个丑陋的函数

3

我已经定义了函数f1

f1 p = foldl (\x y -> x ++ y ++ "\t") "" (map (foldl (++) "") p)

那将需要
[["4","0","1"],["5","2","3"]]

和yield
"401\t523\t"

但这个函数确实很丑陋,我相信有更简单的实现方式。有人能给我一些线索吗?

2个回答

9

函数组合是你的朋友。来自Data.List的intercalate也是。

f1 = intercalate "\t" . map concat

编辑:糟糕,我误读了你的输出。你想要在所有这些末尾加上"\t",而不仅仅是它们之间。在这种情况下,更接近的方法是:

f1 = concat . map ((++ "\t") . concat)

这不包括末尾的 '\t' - dave4420
很好。不幸的是,我不能在这个项目中使用Data.List :( - devoured elysium
2
吞噬艾利西亚,好的,我的第二个函数没有使用Data.List中的任何内容。 - Carl
f1 = concatMap ((++"\t") . concat) 或者 f1 xxs = do xs <- xxs; concat xs ++ "\t" 也是你第二个版本的很好的等价物。话虽如此,这是上学期某人的作业,所以我怀疑我的回答是否及时。 ;) - Edward Kmett

3
作为对未来解决类似问题的建议(补充卡尔的实际解决方案),您可以查看Haskell库如何解决该问题。例如,Data.List.unwords执行与您所需相似的操作。
因此,您可以尝试研究以下内容:

http://hackage.haskell.org/packages/archive/base/4.3.0.0/doc/html/Data-List.html

在本文档中查找unwords,您会注意到有一个“源”链接。单击该链接将带您进入库如何实现它的源代码。通常,该函数不是很大,可能会给您一些关于如何从库中概括(或特化)您的函数的想法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接