0

我在这个网站上看到了这段代码:

输入:foldr (/) 2 [8,12,24,4]

输出:8.0

这个输出是如何计算的?

是 8/(12/(24/(4/2))) = 8.0 吗?

4

1 回答 1

0

是的。

哦,堆栈溢出不允许简短的回答。好的,那么,一个简短的解释是有序的(尽管我认为你已经明白了)。

 

foldr定义为:

foldr :: (a -> b -> b) -> b -> [a] -> b

用简单和更具描述性的术语:

foldr :: function_to_apply -> accumulator_start_value -> list -> accumulator_end_value

wherefunction_to_apply从右到左应用于列表的每个元素,如下所示:

next_accumulator_value = function_to_apply current_element current_accumulator_value

或者在中缀函数(例如/运算符)的情况下:

next_accumulator_value = current_element `function_to_apply` current_accumulator_value

请注意,(/)在您的表达式中只是缩写:

(\current_element current_accumulator_value -> current_element / current_accumulator_value)

 

因此,您的示例计算如下:

foldr (/) 2 [8,12,24,4]  -- ( 4 2 -> 4/2 )
foldr (/) (4/2) [8,12,24]  -- ( 24 (4/2) -> 24/(4/2) )
foldr (/) (24/(4/2)) [8,12]  -- ( 12 (24/(4/2)) -> 12/(24/(4/2)) )
foldr (/) (12/(24/(4/2))) [8]  -- ( 8 (12/(24/(4/2))) -> 8/(12/(24/(4/2))) )
foldr (/) (8/(12/(24/(4/2)))) []  -- nothing to apply to any more, the accumulated expression can now be evaluated

这正是你所描述的。

于 2018-02-21T02:46:49.403 回答