使用foldl创建Haskell函数,将int列表转换为单个int

时间:2016-10-07 09:54:35

标签: haskell

我必须定义一个函数prob2,它接受Ints列表并使用foldl返回一个Int:

HW3*> prob2 [2,3,4,5]

2345

我缺乏使用折叠的经验。我有这个:

prob2 :: [Integer] -> Integer

prob2 (x:xs) = foldl (\x->10*x+xs) 0

2 个答案:

答案 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"