是否可以获取函数列表并返回其复合函数

时间:2017-02-27 19:44:48

标签: haskell

我试图弄清楚如何按照

的方式做点什么
compositeFunctions :: [(a -> a)] -> (a -> a)

我以为我可以使用foldr来连续折叠功能列表,但我无法解决任何问题。

2 个答案:

答案 0 :(得分:11)

foldr完全符合您的要求,因为id(.)的身份(即f . id == f):

compose :: [(a -> a)] -> a -> a
compose = foldr (.) id

以更明确的递归形式:

compose' [] = id
compose' (f:fs) = f . compose' fs

答案 1 :(得分:8)

a -> a形式的函数,即参数和结果具有相同的类型,称为 endomorphisms 。关于给定a的内同态的一个非常酷的事情是它们形成一个以id作为标识并且(.)作为运算符的幺半群。这意味着mconcat应该完全符合您的要求......

compositeFunctions = mconcat

......不幸的是,它稍微复杂一些。为了获得Monoid实例,您必须将您的函数包装在Endo Data.Monoid新类型中,然后打开结果:

compositeFunctions = appEndo . mconcat . fmap Endo