我必须定义一个函数prob2,它接受Ints列表并使用foldl返回一个Int:
HW3*> prob2 [2,3,4,5]
2345
我缺乏使用折叠的经验。我有这个:
prob2 :: [Integer] -> Integer
prob2 (x:xs) = foldl (\x->10*x+xs) 0
答案 0 :(得分:5)
问题在于你仍然在考虑递归。您似乎将问题视为将元素应用于元素和尾部的头部
但是<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<!-- HERE-->
<item name="listPreferredItemHeightSmall">18dp</item>
</style>
采用二元运算符并以累积方式将其应用于列表的元素。对于相同类型的项,它需要二元运算符。
你需要一个带有2个参数的lambda表达式,如下所示:
foldl
这将产生你的整数2345。
答案 1 :(得分:2)
还有一种方式可以象征性地看待我喜欢使用的方式。我们不是foldl
,而是为了简单起见,首先考虑foldl1
。请注意,使用foldl1
通常不是一个好主意,因为它是一个部分函数(传递空列表会导致异常)。
你可以想象foldl1
接受一个运算符和一个列表,并用这个运算符替换列表中的逗号(当然还有适当放置的括号),例如。
foldl1 (+) [1, 2, 3, 4] =
(((1 + 2) + 3) + 4) =
((3 + 3) + 4) =
(6 + 4) =
10
如果关联性适用于运算符,则可以自然地省略括号。由此可见,您传递给foldl
的运算符/函数显然始终在两个单个元素上运行。
请注意,foldl
函数更为通用,因为初始值/结果值的类型不必与列表元素的类型相同,但上面的可视化如果您将初始值设想为&#34;站立&#34;在列表前面:
(+>) :: Show a => String -> a -> String
(+>) accumulator x = accumulator ++ show x
foldl (+>) "" [1, 2, 3, 4] =
(((("" +> 1) +> 2) +> 3) +> 4) =
((("1" +> 2) +> 3) +> 4) =
(("12" +> 3) +> 4) =
("123" +> 4) =
"1234"