我怎样才能让这个功能更优雅
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 次。
我有函数:
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 次。