我已经定义了函数f1
f1 p = foldl (\x y -> x ++ y ++ "\t") "" (map (foldl (++) "") p)
那将需要
[["4","0","1"],["5","2","3"]]
和yield
"401\t523\t"
但这个函数确实很丑陋,我相信有更简单的实现方式。有人能给我一些线索吗?
我已经定义了函数f1
f1 p = foldl (\x y -> x ++ y ++ "\t") "" (map (foldl (++) "") p)
[["4","0","1"],["5","2","3"]]
"401\t523\t"
但这个函数确实很丑陋,我相信有更简单的实现方式。有人能给我一些线索吗?
函数组合是你的朋友。来自Data.List的intercalate也是。
f1 = intercalate "\t" . map concat
编辑:糟糕,我误读了你的输出。你想要在所有这些末尾加上"\t",而不仅仅是它们之间。在这种情况下,更接近的方法是:
f1 = concat . map ((++ "\t") . concat)
http://hackage.haskell.org/packages/archive/base/4.3.0.0/doc/html/Data-List.html
在本文档中查找unwords
,您会注意到有一个“源”链接。单击该链接将带您进入库如何实现它的源代码。通常,该函数不是很大,可能会给您一些关于如何从库中概括(或特化)您的函数的想法。
'\t'
。 - dave4420f1 = concatMap ((++"\t") . concat)
或者f1 xxs = do xs <- xxs; concat xs ++ "\t"
也是你第二个版本的很好的等价物。话虽如此,这是上学期某人的作业,所以我怀疑我的回答是否及时。 ;) - Edward Kmett