Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 如何使此功能更加优雅_Function_Haskell_Parametric Polymorphism - Fatal编程技术网

Function 如何使此功能更加优雅

Function 如何使此功能更加优雅,function,haskell,parametric-polymorphism,Function,Haskell,Parametric Polymorphism,我有以下功能: wrap :: Text -> [Text] -> Text wrap x = intercalate "" . map ((<> x) . (x <>)) 其目的是用给定的字符串包装列表中的每个元素,并将它们连接在一起 map的第一个参数周围的括号让我很恼火,使用也很恼火。因此,我想知道是否有一种更优雅或通用的方式来表达这个功能?复制自我的评论,这样问题就可以标记为已回答 您可以使用foldMap f而不是插入。地图f。请注意,interl

我有以下功能:

wrap :: Text -> [Text] -> Text
wrap x = intercalate "" . map ((<> x) . (x <>))
其目的是用给定的字符串包装列表中的每个元素,并将它们连接在一起


map的第一个参数周围的括号让我很恼火,使用也很恼火。因此,我想知道是否有一种更优雅或通用的方式来表达这个功能?

复制自我的评论,这样问题就可以标记为已回答


您可以使用foldMap f而不是插入。地图f。请注意,interlate相当于Data.Text.concat.

只是为了让我的帽子戴在戒指上。。。因为模式是

xexxexxex
如果es是原始列表中元素的占位符,那么构建此输出的另一种方法是在每个元素之间放置两个X,并手动包装bookends。因此:

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

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

您可以使用foldMap f而不是插入。地图f。请注意,interlate相当于Data.Text.concat.Ah,这很好。现在我有了wrap x=foldMap$x。没有进口的x。wr x str=[x++s++x | s我总是忘记我可以在字符串上使用列表理解,非常酷。我最初确实有类似的东西,但我觉得它不太令人愉快。谢谢。我喜欢你的想法,但我担心最终可能会有点效率问题,因为Interlate不是列表融合的好生产者。我认为最简单的方法是解决这个问题可能会直接使用foldr。@如果这里没有列表,只生成文本。@DanielWagner,啊,我真傻。那么这是否意味着需要某种生成器?