2017-08-12 62 views
0

簡單的問題,不確定如何去做。Haskell:記住列表中的前一個元素

我寫Data.List模塊從之功能更有限的版本,並有下面的代碼:

-- Sum the contents of a list 

sum' :: Num a => [a] -> a 

sum' [] = 0 

sum' (x:xs) = x + sum' rest where 
       rest = drop (succ (elemIndex x xs)) xs 

我相信這會工作,如果elemIndex的X論點在範圍當前列表元素。

我想這樣做,而無需使用可摺疊,作爲基本的可能,因爲這是他蓋,然後摺疊,或大多數Haskell的想法寫在格雷厄姆赫頓的哈斯克爾預期編程問題。

+0

這是使用摺疊的確切情況。我會認爲摺疊是一個「原始」。 – Carcigenicate

+0

總結一個列表,它只是'foldl + numbers'。一旦你使用了幾次,摺疊就非常簡單。 – Carcigenicate

+2

你只是想總結一個數字列表?如果這是你的問題,我會寫一個答案。目前還不清楚你到底要做什麼。 – Carcigenicate

回答

3

如果你想編寫一個求和函數「手動」,它只會是第一要素,加上其餘元素的總和:

sum' :: Num a => [a] -> a 

-- The sum of an empty list is 0 
-- The "base case" of the recursion 
sum' [] = 0 

-- The sum of a non-empty list is equal to the first element 
-- plus the sum of the rest of the list 
sum' (x:xs) = x + (sum' xs) 

這是很好的,但一段時間後,你會意識到你會做很多確切的模式:在保持累加器的同時在列表上循環。在這種情況下,數字的總和就是累加器。 。

這是fold小號進來的摺疊如何工作的完整描述超出的問題,而是要總結用摺疊號碼的列表,你可以簡單的寫:

sum' :: Num a => [a] -> a 
sum' xs = foldl (+) 0 xs 

褶皺基本上插入你給它列表中的每個元素的功能,所以

foldl (+) 0 [1, 2, 3, 4, 5] 

基本同樣的事情(注意來氟米特0噸。這是起始之和):

0 + 1 + 2 + 3 + 4 + 5 

更多關於褶皺,我寫了一個答案(以及許多其他)here。值得一看。

+1

1.您對foldl的解釋非常好2.我沒有意識到它可以像你的第一個答案那樣簡單地寫出來。3. Haskell社區似乎比其他許多人更加理解!我期望被低估爲遺忘,相反,我得到了一個很好的答案,並且學到了一些東西。謝謝 – Typhon

+0

Np。我應該注意到儘管你給'foldl'的函數不需要像數學運算符那麼簡單。摺疊+匿名功能=非常簡潔的循環。 – Carcigenicate

1

如果你懂得鑽營,你可以簡單地把它更:

sum' = foldl (+) 0 
相關問題