2010-12-02 83 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 
相關問題