2010-12-02 32 views
2

比方说,我有值的列表,而我想,直到我得到的最终结果施加的一系列操作:如何在Haskell中运行一系列操作(函数)?

[0, 1, 2] 

firstOperation xs = map (+1) xs 
secondOperation xs = filter even xs 
thirdOperation xs = sum xs 

虽然我肯定还有其他更好的方法来解决这个问题,只有一个我目前所知道的是定义调用这些函数嵌套一个内部另一个功能:

runAllOperations xs = thirdOperation (secondOperation (firstOperation xs)) 

但这两个丑陋的,并提出以下问题:如果我有10个业务,转向这段代码为maintanance噩梦。

这里实现某种类型的东西的正确方法是什么?请记住,我上面给出的例子只是我目前项目所面临的问题的简单化。

+0

方式更具可读性当我看着你的代码段,我看到你要应用到的输入转换。操作在哪里?提示:我认为你是在思考哈斯克尔的错误方式,因此在没有意识到的情况下问错了问题。 – 2010-12-02 22:28:49

+0

我也相信是这样。不幸的是: – 2010-12-03 08:54:43

回答

3

如果你可以让所有的操作的列表,你可以然后在该列表折叠复合算:

foldr (.) id fns 

然后你就可以的,其结果应用到初始值。

虽然您可能需要单独应用最终减少步骤。

+0

只有当所有的操作都具有相同的类型(即[[a] - > [a]`,没有像[[a] - > [b]`) – ephemient 2010-12-02 21:50:28

6

.$()

runAllOperations xs = thirdOperation $ secondOperation $ firstOperation xs 

runAllOperations = thirdOperation . secondOperation . firstOperation 
相关问题