【问题标题】:How can I make this function more elegant我怎样才能使这个功能更优雅
【发布时间】:2019-02-15 05:32:31
【问题描述】:

我有这个功能:

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

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

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

【问题讨论】:

  • 您可以使用foldMap f 而不是intercalate "" . map f。请注意,intercalate "" 等同于 Data.Text.concat。
  • 啊,太好了。现在我有wrap x = foldMap $ (&lt;&gt; x) . (x &lt;&gt;)
  • 没有进口。 wr x str = [ x++s++x | s &lt;- str]concat.wr "!" $ ["one","two","fix"]
  • 我总是忘记我可以对字符串使用列表推导,非常酷。

标签: function haskell parametric-polymorphism


【解决方案1】:

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

您可以使用foldMap f 代替intercalate "" . map f。请注意,intercalate "" 等同于 Data.Text.concat。

【讨论】:

    【解决方案2】:

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

    xexxexxex
    

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

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

    此重写的一个小而不错的功能是,对于长度为 n 的输入列表,这将只导致 n+2 次调用 (&lt;&gt;) 而不是像 indigamer 的答案中的 3n-1 次。

    【讨论】:

    • 我本来也有这样的东西,但我发现它不是那么讨人喜欢。不过还是谢谢。
    • 我喜欢你的想法,但我担心最终的&lt;&gt; 可能会有点效率问题,因为intercalate 不是列表融合的“好生产者”。我认为最简单的解决方法可能是直接使用foldr
    • @dfeuer 无论如何这里没有生成列表,只有Text
    • @DanielWagner,啊,我真傻。那么这是否意味着需要某种构建器?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    • 2016-08-28
    • 1970-01-01
    相关资源
    最近更新 更多