Recursion 返回递归闭包的函数签名

Recursion 返回递归闭包的函数签名,recursion,types,closures,rust,continuations,Recursion,Types,Closures,Rust,Continuations,我正在尝试实现一个返回递归闭包的函数,尽管我不知道如何在函数签名中表达它。下面是Python中工作实现的示例代码 def计数器(状态): def处理程序(msg): 如果msg==“inc”: 打印状态 返回计数器(状态+1) 如果msg='dec': 打印状态 返回计数器(状态-1) 返回处理器 c=计数器(1) 对于范围内的x(1000000): c=c('inc') 和防锈的伪代码 enum Msg { Inc, Dec } fn counter(state: Int)

我正在尝试实现一个返回递归闭包的函数,尽管我不知道如何在函数签名中表达它。下面是Python中工作实现的示例代码

def计数器(状态):
def处理程序(msg):
如果msg==“inc”:
打印状态
返回计数器(状态+1)
如果msg='dec':
打印状态
返回计数器(状态-1)
返回处理器
c=计数器(1)
对于范围内的x(1000000):
c=c('inc')
和防锈的伪代码

enum Msg {
    Inc,
    Dec
}

fn counter(state: Int) -> ? {
    move |msg| match msg {
        Msg::Inc => counter(state + 1),
        Msg::Dec => counter(state - 1),
    }
}

因为Rust支持递归类型,所以只需在单独的结构中对递归进行编码:

enum Msg { 
    Inc,
    Dec,
}

// in this particular example Fn(Msg) -> F should work as well
struct F(Box<FnMut(Msg) -> F>);

fn counter(state: i32) -> F {
    F(Box::new(move |msg| match msg {
        Msg::Inc => {
            println!("{}", state);
            counter(state + 1)
        }
        Msg::Dec => {
            println!("{}", state);
            counter(state - 1)
        }
    }))
}

fn main() {
    let mut c = counter(1);
    for _ in 0..1000 {
        c = c.0(Msg::Inc);
    }
}
enum Msg{
股份有限公司,
12月,
}
//在这个特定的示例中,Fn(Msg)->F也应该起作用
结构F(框F>);
fn计数器(状态:i32)->F{
F(框::新建(移动|消息|匹配消息{
Msg::Inc=>{
println!(“{}”,州);
计数器(状态+1)
}
Msg::Dec=>{
println!(“{}”,州);
计数器(状态-1)
}
}))
}
fn main(){
设mut c=计数器(1);
对于0..1000中的uu{
c=c.0(Msg::Inc);
}
}
不幸的是,我们不能在这里取消装箱——因为未装箱的闭包有无法计量的类型,我们需要将它们装箱到trait对象中,以便能够在结构声明中命名它们