我有一些我正在编写的代码,我需要折叠双打列表,但是,即使是这么简单的代码行也会给我一些我不理解的错误,即:
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]
整数的例子是相同的格式,所以我不明白为什么会有“太少的论点”,我是否需要进行某种转换?
答案 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)
,b
,t 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 (+)