我在这个网站上看到了这段代码:
输入:foldr (/) 2 [8,12,24,4]
输出:8.0
这个输出是如何计算的?
是 8/(12/(24/(4/2))) = 8.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
这正是你所描述的。