简化Haskell中的丑陋功能

时间:2010-12-02 22:29:58

标签: haskell coding-style functional-programming

我已经定义了函数f1

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

将采取

[["4","0","1"],["5","2","3"]]

和收益

"401\t523\t"

但是它是一个丑陋的功能。我确信有一种更简单的方法来实现相同的功能。有人能给我一些线索吗?

2 个答案:

答案 0 :(得分:9)

功能组合是你的朋友。所以是从Data.List

插入的
f1 = intercalate "\t" . map concat

编辑:哎呀,误读你的输出。你想要“\ t”在所有这些结尾,而不仅仅是它们之间。在这种情况下,它更接近

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

答案 1 :(得分:3)

作为方法在未来解决类似问题的建议(赞助Carl的实际解决方案),您可以做的是查看Haskell库如何解决问题。例如,Data.List.unwords执行类似于您想要的操作。

所以,你可以尝试一下:

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

在本文档中查找unwords,您会发现存在“来源”链接。单击那里将带您了解库如何实现它的来源。通常,函数不是那么大,可能会给你一些关于如何从库中推广(或专门化)函数的想法。