我有一个清单
[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]
我只需要返回最后一个清单...... 顺便说一下这只是简化版,原来我有列表清单...我只是想不出如何调用函数如何描述.. 谢谢。
答案 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]
答案 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))