大多数惯用的实现`[a - > a] - > (a - > a)`

时间:2013-11-04 21:32:34

标签: function haskell function-composition

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

一些变体包括

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

foo = foldr (.) id

foo = appEndo . mconcat . map Endo

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

2 个答案:

答案 0 :(得分:19)

我会说你不会打败

comp = foldr (.) id

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

如果你看一下andsummaximum等类似的实现,你会发现它们是如何在标准库中实现的,我不知道认为你比这更习惯:)

Tangent:我毫不犹豫地添加了评论中提到的foldr1变体,因为我会说这是意外的行为,因为它显然必须是maximum

答案 1 :(得分:6)

另一个,可能不短于foldr (.) id,但我觉得很可爱:

foo = flip (foldr id)