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

时间:2011-10-13 10:30:17

标签: haskell recursion

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

类似的东西:

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"

2 个答案:

答案 0 :(得分: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 :(得分:1)

这实际上取决于index参数的确切错误。你想摆脱它,因为你不想一直传递它吗?然后答案是:你不应该这样做,因为它会使你的代码更难理解。但是,如果你坚持,你可以使用州monad。再说一遍:如果你的理由很方便,那真的不行。几乎在所有情况下,特别是在你的情况下,最终会不太方便。

摆脱参数的一个正当理由是它在列表长度函数中是多余的,它总是用0初始化它的累加器。在这种情况下,请参阅bzn的答案。