如何在Rust中模拟Lisp(apply)或(curry)?

mca*_*dre 7 testing quickcheck rust

我正在将QuickCheck移植到Rust,我写了一切,除非for_all我不确定类型签名应该是什么.

我知道,一般来说,for_all将接受属性lambda和生成器lambda的集合.它将评估生成器以创建随机测试用例以将属性作为输入.

它应该打印+++ OK, passed 100 tests.,如果属性返回true,否则要打印*** Failed!,打印违规测试用例值.

Pau*_*fer 7

在Rust中,所有函数都使用固定数量的参数,因此apply在一般情况下不存在与Lisp等效的东西,但是宏可以为您提供所需的抽象.你可以写:

macro_rules! for_all {
    ( $tester:expr, $( $generator:expr ),* ) => {
        $tester( $($generator() ),* )
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,for_all!(|a, b| a + b, || 4, || 7)产生11.

祝你的项目好运!


Nik*_*kis 0

你能准确描述你想要什么吗?我认为你要求的是这样的:

fn for_all<A>(test: fn(A) -> bool, generators: &[fn() -> A]) -> bool {
    generators.iter().all(|gen| test(gen()))
}

fn main() {
    let generators: Vec<fn() -> (i32, i32)> = vec![
        || (1, 2),
        || (2, 3),
        || (3, 4),
    ];

    for_all(|(a, b)| a < b, &generators);
}
Run Code Online (Sandbox Code Playgroud)