4

如果我有一个函数列表,每种类型都a -> a对应某种类型,那么组合它们的最短、优雅和惯用的方法是什么?最好不添加额外的依赖项?

一些变体包括

foo (x:xs) = x . (foo xs)
foo [] = id

foo = foldr (.) id

foo = appEndo . mconcat . map Endo

但出于某种原因,我期待找到更好的东西。

4

2 回答 2

19

我会说你打不过

comp = foldr (.) id

为什么?好吧,我们有一个清单,我们正试图以正确的关联方式减少它。

如果您查看、和类似的实现and,您会发现这就是它们在标准库中的实现方式,我认为您不会比这更惯用 :)summaximum

切线:我不愿添加foldr1评论中提到的变体,因为我会说这是部分的意外行为,不像说它maximum显然必须在哪里。

于 2013-11-04T22:06:28.063 回答
6

另一个,可能不短,foldr (.) id但我认为很可爱:

foo = flip (foldr id)
于 2013-11-05T01:06:40.583 回答