Haskell函数将操作递归应用于参数

Haskell函数将操作递归应用于参数,haskell,ghc,Haskell,Ghc,Haskell中是否有内置函数将操作列表递归应用于参数? 我有一个操作列表要应用于双精度(乘法、加法等),我只想得到结果。 例如: operationList = [ (\v -> v/8+2) , (\v -> v-12) , (\v -> v*v) ] func operationList 3 func应返回92640625 我在hoogl

Haskell中是否有内置函数将操作列表递归应用于参数?

我有一个操作列表要应用于
双精度
(乘法、加法等),我只想得到结果。 例如:

operationList = [
                  (\v -> v/8+2)
                , (\v -> v-12)
                , (\v -> v*v)
                ]

func operationList 3
func
应返回
92640625

我在hoogle搜索了签名
[(a->a)]->a->a
,但没有找到任何东西

\> foldr ($) 3 (reverse operationList)
92.640625

有(至少)两种方法来解决这个问题。一种是将每个函数应用于应用前一个函数的结果。这将为您提供:

foldr ($) 3 (reverse operationList)
另一种方法是首先将所有函数组合在一起,然后将结果函数应用于参数:

foldr (.) id (reverse operationList) 3
组合下函数的这种行为也由
Endo
monoid捕获:

appEndo (foldMap Endo (reverse operationList)) 3
列表必须颠倒,因为foldr从“右向左”折叠:


你不应该为了折叠列表而将其反转<如果我没弄错的话,code>foldr f n(反向xs)=foldl(翻转f)nxs。我相信
foldMap(Dual.Endo)
是使用
Foldable
@dfeuer实现的方法,但是从概念上讲,
foldl
版本要复杂得多。我想了解基本概念,而不是停留在administrivia上。不过,
Dual
版本相当不错。此外,我还怀疑OP可以控制实际应用程序中的列表顺序,因此不需要反转。
appEndo (foldMap Endo (reverse operationList)) 3
foldr ($) 3 [f,g,h]
= { definition of foldr }
f $ g $ h $ 3
= { definition of ($) }
f (g (h 3))

foldr (.) id [f,g,h] 3
= { definition of foldr }
(f . g . h . id) 3
= { definition of (.), definition of id, eta reduction }
f (g (h 3))