我正在尝试创建一个将[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的新手
答案 0 :(得分:6)
如果您有一个空列表,并且想要添加一些元素,那么真的是否要返回空列表?不。请删除以下行:
prepend [] _ _ = []
毕竟,prepend [] 2 0
应该是[0,0]
而不是[]
。除此之外,它工作正常,但您可以使用concatMap
和replicate
编写它:
concatMap (replicate 2) [1..10]