2016-11-08 34 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

谢谢,我刚刚发布了硬编码版本作为一个例子...实际代码更复杂,并且确实通过了双倍可用列表 –