我具有以下功能:
wrap :: Text -> [Text] -> Text
wrap x = intercalate "" . map ((<> x) . (x <>))
其目的是用给定的字符串包装列表中的每个元素,并将它们全部结合在一起。
要映射的第一个参数的方括号使我很烦,“”的用法也使我烦恼。因此,我想知道是否有一种更优雅的(或者我想是通用的)方式来表达此功能?
答案 0 :(得分:6)
(摘自我的评论,因此该问题可以标记为已回答。)
您可以使用foldMap f
代替intercalate "" . map f
。请注意,intercalate ""
等效于Data.Text.concat。
答案 1 :(得分:2)
只要戴上帽子...因为图案是
xexxexxex
(其中e
是原始列表元素的占位符),构建此输出的另一种方法是在每个元素之间放置两个x
,并手动包装书挡。所以:
wrap x es = x <> intercalate (x <> x) es <> x
此重写的一个小而精妙的功能是,对于长度为n的输入列表,这只会招致对(<>)
的n + 2次调用,而不像indigamer的答案中的3n-1。