在列表中散布分隔符有两种可能性:
[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 ?
答案 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]]
。
将内联的函数编写为concatMap
或foldr
比编写一个好名称更容易。