2013-03-18 64 views
0

我有一個列表一個列表上有多個函數?

[1,1,1,1,1] 

,我試圖寫函數將返回列表

[2,3,4,5,6] 

我想使用函數映射這樣

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

將返回

[2,2,2,2,2] 

之後,我想調用返回列表的最後四個元素的映射函數,所以在我得到[2,2,2,2,2]後,我想使用最後四個[2,2,2,2]上的映射將返回[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

都應該立即採取退換嗎?或者只有最後一個列表,[2,3,4,5,6] – kaan 2013-03-18 16:47:10

+0

我們可以如何幫助您? – Ingo 2013-03-18 16:47:49

+0

only last list [2,3,4,5,6] – Martin877 2013-03-18 17:13:49

回答

0

將這樣的事情你想要做什麼?

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

zip基本上對列表中的每個元素與你想要的東西添加到它,和地圖功能,然後將每個元素在列表中該值以得到你想要的結果。

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] 
+2

我不認爲OP正在尋找這個函數,儘管它爲'(+1)'的情況提供了正確的答案。對於其他輸入功能,例如'(+2)',它不起作用。 – nymk 2013-03-18 17:07:44

0

你的算法版本O(n )時間:

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)) 
8

我想你想要像

mapTails f [] = [] 
mapTails f (x:xs) = f x : mapTails f (map f xs) 
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

IMO最ELEG螞蟻的方式將

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

太棒了!我認爲它應該是'zipWith($)$ tail $ iterate((+ 1)。)id'。 – nymk 2013-03-18 17:44:51

+0

我最喜歡這個解決方案。其他人要麼不夠通用,要麼不夠高雅。 +1。儘管我會使用更多的haskelly語法,並且沒有'($)':'zipWith($)(iterate(succ。)succ)(replicate 5 1)'。 – ertes 2013-03-18 23:15:44

相關問題