我怎样才能让这个功能更优雅

How can I make this function more elegant

我有函数:

wrap :: Text -> [Text] -> Text
wrap x = intercalate "" . map ((<> x) . (x <>))

其目的是用给定的字符串包装列表的每个元素并将它们连接在一起。

映射的第一个参数周围的括号让我很烦,“”的使用也是如此。所以我想知道是否有更优雅(或者我猜是通用)的方式来表达这个功能?

(从我的评论中复制,以便将问题标记为已回答。)

您可以使用 foldMap f 而不是 intercalate "" . map f。请注意 intercalate "" 等同于 Data.Text.concat.

只是为了把我的帽子戴在戒指上...因为图案是

xexxexxex

(其中 e 是原始列表元素的占位符),构建此输出的另一种方法是在每个元素之间放置两个 x,并手动包装书挡.所以:

wrap x es = x <> intercalate (x <> x) es <> x

这个重写的一个小而好的特性是,对于长度为 n 的输入列表,这只会导致对 (<>) 的 n+2 次调用,而不是 indigamer 的回答中的 3n-1 次。