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的编译器根据函数的第一次使用为高阶函数的参数提供了一个类型,因此无法对其进行泛化。生成高阶函数的唯一方法是对其进行泛化。