我试图弄清楚如何按照
的方式做点什么compositeFunctions :: [(a -> a)] -> (a -> a)
我以为我可以使用foldr
来连续折叠功能列表,但我无法解决任何问题。
答案 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