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,提问作者안태찬
相关产品推荐
相关产品推荐

