假设我有一个值列表,我希望在获得最终结果之前应用一系列操作:
[0, 1, 2]
firstOperation xs = map (+1) xs
secondOperation xs = filter even xs
thirdOperation xs = sum xs
虽然我确信还有其他更好的方法可以解决这个问题,但我目前唯一知道的是定义一个函数,该函数将所有这些函数嵌套在另一个函数中:
runAllOperations xs = thirdOperation (secondOperation (firstOperation xs))
但这既丑陋又引发了一个问题,如果我有10次操作,就会把这段代码变成维护噩梦。
在这里实施某种类似的正确方法是什么?请记住,我上面给出的示例仅仅是对我当前项目所面临的内容的过度简化。
答案 0 :(得分:6)
.
或$
比(
和)
更具可读性
runAllOperations xs = thirdOperation $ secondOperation $ firstOperation xs
或
runAllOperations = thirdOperation . secondOperation . firstOperation
答案 1 :(得分:4)
如果您可以列出所有操作,则可以将合成运算符折叠到该列表上:
foldr (.) id fns
然后您可以将结果应用于初始值。
虽然您可能需要单独应用最终缩减步骤。