2016-11-08 37 views
0

我有一些代碼我寫,我需要摺疊雙打的名單,但是,代碼連這個簡單的線條給我的錯誤我不明白,即:如何摺疊Double類型的列表?

Couldn't match expected type ‘Double’ 
      with actual type ‘t0 [t1] -> [t1]’ 
Probable cause: ‘foldr’ is applied to too few arguments 
In the expression: foldr (+) [3.3, 1.4, 5.5] 
In an equation for ‘foldDoubles’: 
    foldDoubles = foldr (+) [3.3, 1.4, 5.5] 

爲一個簡單的例子:

foldDoubles = foldr相似(+)3.3,1.4,5.5]

例子爲整數都是以相同的格式,所以我不明白爲什麼會有「參數太少」,我需要做某種轉換?

回答

4

可能的原因:「foldr相似」被應用到的參數太少

這是因爲foldr應用於參數太少。觀察:

foldr (+) [3.3, 1.4, 5.5] 
--  one two 

但是:

:type foldr 
Foldable t => (a -> b -> b) -> b -> t a -> b 
--    one   two three 

你缺少b類型的參數。在這種情況下,你似乎想和這樣也許你想使用零累加器開始貴了一倍:

foldr (+) 0 ... 
+0

謝謝你,做到了..看着哈斯克爾wiki和他們的第一個例子是'倍(+)[1,2,3,4 ,5]'這有點誤導我猜 –

+0

@MarcusRuddick'fold'不是'foldr'。 –

+0

@MarcusRuddick這仍然是錯誤的,來自'Data.Foldable'的'fold'的典型定義不包含函數參數。 「haskell wiki」在哪裏? Google的代碼與您在haskell-lang.org上一次性顯示的代碼類似(與haskell不同)。org,這通常是「haskell wiki」的意思),但-lang站點似乎已經刪除了他們的wiki。如果你能指出資源,那麼我們可以努力解決它。 –

2

foldr函數的類型是Foldable t => (a -> b -> b) -> b -> t a -> b,其中包括包括三個參數((a -> b -> b)bt a)而你只包含兩個參數。我們可以重寫foldDoubles加入b類型的基本情況,以修復這個錯誤來保存我們的單硬編碼列表計算方面:

foldDouble = foldr (+) 0 [3.3, 1.4, 5.5] 

但是,讓我們看得更遠一些。相反,硬編碼列表[3.3, 1.4, 5.5]的,我們可以接受一個列表並返回它和通用功能(這只是SUM函數):

foldDouble xs = foldr (+) 0 xs 

,我們可以在一般的列表使用就像我們Prelude-定義和功能:

ghci>> foldDouble [3.3, 1.4, 5.5] 
10.2 

接下來,我們可以ETA-減少這種去得到一個稍微乾淨形式:

foldDouble = foldr (+) 0 

最後,有一個方便的功能foldr1,它允許我們擺脫我們的基本情況(列表中的最後一個元素被認爲是基本情況)。使用這個功能,我們可以擺脫0的:

foldDouble = foldr1 (+) 
+0

謝謝,我剛剛發佈了硬編碼版本作爲一個例子...實際代碼更復雜,並且確實通過了雙倍可用列表 –