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

the*_*boo 9 haskell

我试图弄清楚如何做一些事情

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)


use*_*560 8

形式的函数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)

  • 或者更简洁的`compositeFunctions = appEndo.foldMap Endo`,正如我在评论中提到的那样. (4认同)
  • 因为函数箭头也允许类似有用的`实例Monoid m => Monoid(r - > m)`. (3认同)