我试图编写一个递归函数来做某事,但在每一步我都想知道树中的当前深度/索引。那么如何在不使用函数签名中的索引参数的情况下实现这一目标呢?
类似的东西:
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"
答案 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的答案。