You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust中Church数转usize函数计数异常问题修复请求

修复Church Numeral转usize的Rust函数

问题核心是错误地用Rc包裹了传给Church数的闭包,导致Church数无法正确调用该闭包执行递增操作,最终计数器始终为0。以下是修复后的代码:

use std::cell::RefCell;
use std::rc::Rc;

/// Church numeral的类型定义(补充完整以匹配函数逻辑)
pub type Church<T> = fn(Box<dyn Fn(T) -> T>) -> Box<dyn Fn(T) -> T>;

/// 将Church numeral转换为usize类型
pub fn to_usize<T: 'static + Default>(n: Church<T>) -> usize {
    let counter = Rc::new(RefCell::new(0));
    let counter_clone = Rc::clone(&counter);

    // 用Box包装闭包,匹配Church数要求的参数类型,而非错误的Rc包裹
    let result_func = n(Box::new(move |x| {
        *counter_clone.borrow_mut() += 1;
        x
    }));

    let _ = result_func(Default::default());

    *counter.borrow()
}

关键修复说明

  • 移除闭包的Rc包裹:Church数的参数要求是Box<dyn Fn(T)->T>类型的函数,原代码用Rc包裹闭包导致类型不匹配,闭包从未被调用。
  • 保留Rc<RefCell<usize>>:确保闭包在被Church数重复调用(n次)时,能修改同一个计数器实例,正确累计调用次数。

验证示例

定义Church数3并测试转换结果:

fn church_three<T>() -> Church<T> {
    |f| Box::new(move |x| f(f(f(x))))
}

fn main() {
    assert_eq!(to_usize(church_three()), 3);
}

内容的提问来源于stack exchange,提问作者안태찬

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 12:10:22