如何折叠Double类型的列表?

时间:2016-11-08 23:21:42

标签: haskell double fold

我有一些我正在编写的代码,我需要折叠双打列表,但是,即使是这么简单的代码行也会给我一些我不理解的错误,即:

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]

整数的例子是相同的格式,所以我不明白为什么会有“太少的论点”,我是否需要进行某种转换?

2 个答案:

答案 0 :(得分:4)

  

可能原因:'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 ... 类型的参数。在这种情况下,你似乎想要一个总和,所以也许你想用零作为累加器开始你的折叠:

SharedPreferences sharedpreferences = getSharedPreferences("MyPREFERENCES",Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedpreferences.edit();
editor.putString("TAG",reminder);
editor.commit();

答案 1 :(得分: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]进行硬编码:

foldDouble xs = foldr (+) 0 xs

我们可以在一般列表中使用,就像我们的Prelude-defined sum函数一样:

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

接下来,我们可以通过eta-reduce来获得更清晰的形式:

foldDouble = foldr (+) 0

最后,有一个方便的函数foldr1允许我们摆脱我们的基本情况(列表中的最后一个元素被认为是基本情况)。使用此功能,我们可以摆脱0

foldDouble = foldr1 (+)
相关问题