Rust 如何在铁锈中进行高阶成分分析?

Rust 如何在铁锈中进行高阶成分分析?,rust,functional-programming,Rust,Functional Programming,我有这样一个功能: fn组合 主要原因是我希望Curry能够实现无点编程。在Rust中,Curry很难实现。严格的类型系统、生命周期和嵌套的impl特征并不存在,所有这些都会在你尝试时毁掉你的一天。但是,可以创建一个宏来curry函数,我曾经在代码golf中这样做过。非OLFED版本如下所示: macro\u规则!咖喱{ ( $f:ident $( ($args:ident:$types:ty) )* ) => { $(移动|$args:$types |)* $f( $($args)* )

我有这样一个功能:

fn组合

  • 主要原因是我希望Curry能够实现无点编程。

    在Rust中,Curry很难实现。严格的类型系统、生命周期和嵌套的
    impl
    特征并不存在,所有这些都会在你尝试时毁掉你的一天。但是,可以创建一个宏来curry函数,我曾经在代码golf中这样做过。非OLFED版本如下所示:

    macro\u规则!咖喱{
    (
    $f:ident
    $(
    ($args:ident:$types:ty)
    )*
    ) => {
    $(移动|$args:$types |)*
    $f(
    $($args)*
    )
    }
    }
    
    这与
    name(arg1,type1)(arg2,type2)…(argN,typeN)
    形式的表达式匹配,并返回导致函数调用的
    move
    闭包链。然而,大多数情况下,您只需对类型使用
    \uuu
    ,然后让推理来解决它。将其与
    compose
    一起使用非常简单:

    let inc=|x | x为u32+1;
    设double=|x | x*2;
    让咖喱=咖喱!(组成(f:)(g:));
    断言!(咖喱)(包括)(双份)(7份),16份;;
    
    在本例中,宏生成的代码如下所示:

    move | f:| move | g:| compose(f,g)
    
    它只需要获取提供的名称和类型并将其粘贴到闭包头中,这样您就可以使用它将泛型函数的参数强制转换为具体类型。

    有一个用于部分应用程序宏的板条箱,但实际上没有任何语言支持。您可能会对一个提供
    管道的流行板条箱感兴趣!()
    macro。问题不在于是否可以使用两个以上的参数进行合成,这相当简单,问题在于是否可以使用curry进行合成。我还将提到使用return position implication Trait进行curry的注释线程:。但是,嵌套的impl-Trait不可用,因此类似的方法(目前)不起作用:当Fn-Trait变得稳定时,可以编写一个proc宏,将函数转换为实现Fn的结构,同时为其生成一个curry()方法,这样您就可以将其用作foo(a,b,c)或foo.curry()(a)(b)(c).我很想将此标记为答案,只是因为它的简单性和扩展性,尽管它仍然存在相同的“类型劫持/依赖”问题。如果没有更好的结果,我会记下来的。谢谢你,我投你一票@Carlobagnoligomez我不知道你所说的“类型劫持/依赖”问题是什么意思,有了这个宏,你应该可以调用任何安全函数。如果您进一步详细说明,我可能会提供更好的帮助。因此,当从
    compose
    函数创建高阶函数时,从某种意义上说,我们可以传递任何其他函数以在第一个函数之后执行操作,它只在只传递一个函数时才起作用。这听起来可能很冗长,所以这里有一个更好的解释。我称之为劫持,因为Rust的编译器根据函数的第一次使用为高阶函数的参数提供了一个类型,因此无法对其进行泛化。生成高阶函数的唯一方法是对其进行泛化。