折叠会产生一个空列表

时间:2014-10-31 15:30:53

标签: haskell fold

我正在尝试创建一个将[1..10]转换为[1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10]的函数。到目前为止我所拥有的是prepend,它会在列表的开头添加一些相同的元素:

-- prepend value num times to the start of list (eg: prepend [] 5 1 = [1,1,1,1,1]
prepend :: [a] -> Int -> a -> [a]
prepend [] _ _ = []
prepend list 0 _ = list
prepend list num value = prepend (value : list) (num - 1) value

要创建最终列表,我正在使用foldl,如下所示:

foldl (\acc x -> (prepend acc 2 x)) [] [1..10]

我希望它能够通过[1..10],并为每个元素添加2个x到acc,但是当我把它放入GHCI时我才回来[]

我是来自C / C ++背景的Haskell的新手

1 个答案:

答案 0 :(得分:6)

如果您有一个空列表,并且想要添加一些元素,那么真的是否要返回空列表?不。请删除以下行:

prepend [] _ _ = []

毕竟,prepend [] 2 0应该是[0,0]而不是[]。除此之外,它工作正常,但您可以使用concatMapreplicate编写它:

concatMap (replicate 2) [1..10]