如果我有一个函数列表,每个类型a -> a
都属于某种类型,那么组合它们的最短,优雅和惯用的方法是什么;最好不要添加额外的依赖项?
一些变体包括
foo (x:xs) = x . (foo xs)
foo [] = id
和
foo = foldr (.) id
和
foo = appEndo . mconcat . map Endo
但出于某种原因,我期待找到更好的东西。
答案 0 :(得分:19)
我会说你不会打败
comp = foldr (.) id
为什么呢?好吧,我们有一个列表,我们正试图以正确的关联方式减少它。
如果你看一下and
,sum
,maximum
等类似的实现,你会发现它们是如何在标准库中实现的,我不知道认为你比这更习惯:)
Tangent:我毫不犹豫地添加了评论中提到的foldr1
变体,因为我会说这是意外的行为,因为它显然必须是maximum
。
答案 1 :(得分:6)
另一个,可能不短于foldr (.) id
,但我觉得很可爱:
foo = flip (foldr id)