我试图弄清楚如何做一些事情
compositeFunctions :: [(a -> a)] -> (a -> a)
Run Code Online (Sandbox Code Playgroud)
我以为我可以foldr用来连续折叠功能列表,但我无法解决任何问题.
che*_*ner 11
foldr完全符合你的要求,因为它id是(.)(即f . id == f)的身份:
compose :: [(a -> a)] -> a -> a
compose = foldr (.) id
Run Code Online (Sandbox Code Playgroud)
以更明确的递归形式:
compose' [] = id
compose' (f:fs) = f . compose' fs
Run Code Online (Sandbox Code Playgroud)
形式的函数a -> a,即参数和结果具有相同的类型,被称为内同胚.关于给定的内同胚的一个非常酷的事情a是它们形成一个具有id身份和(.)操作符的幺半群.这意味着mconcat应该完全按照自己的意愿行事......
compositeFunctions = mconcat
Run Code Online (Sandbox Code Playgroud)
......不幸的是,它稍微复杂一些.为了获取Monoid实例,您必须将函数包装在Endonewtype中Data.Monoid,然后打开结果:
compositeFunctions = appEndo . mconcat . fmap Endo
Run Code Online (Sandbox Code Playgroud)