一个列表上的多个功能?

时间:2013-03-18 16:36:13

标签: list haskell

我有一个清单

[1,1,1,1,1]

我正在尝试编写将返回列表的函数

[2,3,4,5,6]

我想使用像这样的功能图

map (+1) [1,1,1,1,1]

将返回

[2,2,2,2,2]

之后我想在返回列表的最后四个元素上调用map函数,所以在得到[2,2,2,2,2]之后我想在最后四个[2,2,2,2]上使用map将返回[3,3,3,3]并替换第一个地图调用中的最后四个元素,以便得到[2,3,3,3,3]等。

map (+1)[1,1,1,1,1] 
map (+1)  [2,2,2,2] 
map (+1)    [3,3,3] 
map (+1)      [4,4] 
map (+1)        [5]

返回:

[2,2,2,2,2]
[2,3,3,3,3] 
[2,3,4,4,4]
[2,3,4,5,5]
[2,3,4,5,6]

我只需要返回最后一个清单...... 顺便说一下这只是简化版,原来我有列表清单...我只是想不出如何调用函数如何描述.. 谢谢。

6 个答案:

答案 0 :(得分:8)

我想你想要像

这样的东西
mapTails f [] = []
mapTails f (x:xs) = f x : mapTails f (map f xs)

答案 1 :(得分:4)

IMO最优雅的方式是

zipWith($) $ iterate((+1).) id

答案 2 :(得分:3)

scanl 几乎做你想做的事:

Prelude> scanl (+) 1 [1,1,1,1,1]
[1,2,3,4,5,6]

您可以删除第一个项目,这只是我们传入的初始状态值:

Prelude> tail $ scanl (+) 1 [1,1,1,1,1]
[2,3,4,5,6]

答案 3 :(得分:1)

您可以使用递归函数来完成您正在寻找的内容,而不是:

myFn :: Num a => [a] -> [a]
myFn []     = []
myFn (x:xs) = x + 1 : (myFn $ map (+1) xs)

main = print $ myFn [1,1,1,1,1]  -- Prints [2,3,4,5,6]

请参阅http://codepad.org/wBwynlGt

答案 4 :(得分:0)

这样的事情能做你想做的吗?

startList = [1,1,1,1] -- orwhatever you want it to be 
map (\(x,i) -> x + i) $ zip startList [1..]

zip基本上将列表中的每个元素与您要添加的内容配对,然后map函数将列表中的每个元素添加到该值以获得所需的结果。

答案 5 :(得分:0)

您的算法版本O(n 2 )时间:

plusSlow :: [Int] -> [Int]
plusSlow [] = []
plusSlow (x:xs) = (head mapped):(plusSlow $ tail mapped)
                 where mapped = map (+1) (x:xs)

更快的版本O(n)时间:

plusFast :: [Int] -> [Int]
plusFast x = pf x 1

pf :: [Int] -> Int -> [Int]
pf [] _ = []
pf (x:xs) n = (x+n):(pf xs (n+1))