在不使用索引参数的情况下索引递归

nem*_*ixx 1 recursion haskell

我试图编写一个递归函数来做某事,但在每一步我都想知道树中当前的深度/索引.那么如何在不使用函数签名中的索引参数的情况下实现这一目的呢?

就像是:

rec_fn n = do print index
              do_something n
              if n > 0
                then rec_fn (n-1)
                else print "end"
Run Code Online (Sandbox Code Playgroud)

所以我如何获得index,而不做以下事情:

rec_fn n i = do print i
                do_something n
                if n > 0
                  then rec_fn (n-1) (i+1)
                  else print "end"
Run Code Online (Sandbox Code Playgroud)

bzn*_*bzn 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"
Run Code Online (Sandbox Code Playgroud)

这是一种在Haskell中经常使用的模式.