穿插和隐藏功能prependToAll

时间:2015-05-12 15:49:13

标签: haskell

在列表中散布分隔符有两种可能性:

  • [x1, sep, x2, sep, .. xn]

  • [sep, x1, sep, x2, .. sep, xn]

使用功能"散布"在Data.List中:

λ> intersperse 0 [1..5]
[1,0,2,0,3,0,4,0,5] 
λ> 0 : intersperse 0 [1..5]
[0,1,0,2,0,3,0,4,0,5]

然而,使用隐藏(未导出)功能可以简化第二种情况" prependToAll":

λ> prependToAll 0 [1..5]
[0,1,0,2,0,3,0,4,0,5]

为什么在Data.List库中导出散布而导出双 prependToAll

2 个答案:

答案 0 :(得分:7)

来自the comment on prependToAll in the Data.List source code

 ...
 -- Not exported:
 -- We want to make every element in the 'intersperse'd list available
 -- as soon as possible to avoid space leaks. Experiments suggested that
 -- a separate top-level helper is more efficient than a local worker.
 ...

答案 1 :(得分:0)

prependToAll并不是一个明确的名字。我猜对了

prependToAll x = map (x :)

以便prependToAll :: a -> [[a]] -> [[a]]

将内联的函数编写为concatMapfoldr比编写一个好名称更容易。