如何使此功能更优雅

时间:2019-02-15 05:32:32

标签: function haskell parametric-polymorphism

我具有以下功能:

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

其目的是用给定的字符串包装列表中的每个元素,并将它们全部结合在一起。

要映射的第一个参数的方括号使我很烦,“”的用法也使我烦恼。因此,我想知道是否有一种更优雅的(或者我想是通用的)方式来表达此功能?

2 个答案:

答案 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。