2011-10-13 40 views
1

我試圖編寫一個遞歸函數來執行某些操作,但是在每一步我都想知道樹中的當前深度/索引。那麼,如何在不使用函數簽名中的索引參數的情況下實現這一點?沒有使用索引參數的索引遞歸

喜歡的東西:

rec_fn n = do print index 
       do_something n 
       if n > 0 
       then rec_fn (n-1) 
       else print "end" 

讓我怎麼獲得index,沒有做這樣的事情:

rec_fn n i = do print i 
       do_something n 
       if n > 0 
        then rec_fn (n-1) (i+1) 
        else print "end" 

回答

12

好吧,如果你的功能取決於當前的指數應該把它作爲一個參數。否則,你會破壞純函數的很多優點,比如引用透明。

如果其對在函數調用擺脫額外的參數,你可以使用一個輔助函數如下所示:

rec_fn n = go n 0 
    where go n i = do print i 
         do_something n 
         if n > 0 
         then go (n-1) (n+1) 
         else print "end" 

這是所使用經常在Haskell的模式。

1

這實際上取決於索引參數到底是什麼問題。你想擺脫它,因爲你不想一直傳遞它嗎?那麼答案是:你不應該這樣做,因爲這會讓你的代碼更難理解。但是,如果你堅持,你可以使用狀態monad。再說一遍:如果你的理由很方便,那麼不要這樣做。在幾乎所有情況下,特別是在你的情況下,最終會不太方便。

擺脫參數的一個正當理由是什麼時候它像列表長度函數一樣是多餘的,它總是使用0初始化其累加器。在這種情況下請參閱bzn的答案。