不能用泛型类型定义闭包吗?

Ken*_*oth 1 functional-programming rust

我是一名函数式程序员,并尝试以函数式方式使用 Rust。

我读了

Nightly Rust 中的 Monad 和 GAT

然而,令人失望的是看到代码只是在 OOP 范式中实现 Object&Method。

Monad 和 Functor 可以用纯函数的方式定义,而根本上需要的是高阶泛型类型函数(人们更喜欢称之为 HKT 或其他什么)。

我也读过这里

可以定义通用闭包吗?

但这是6年前的事了。

无论哪种方式,如果没有高阶泛型类型函数,就不可能以标准函数方式组合 Functor 或 Monad。

我也很惊讶我无法以简单的 lambda 表达式形式正确定义简单的恒等函数。

let identity = <T>|a:T| a;
Run Code Online (Sandbox Code Playgroud)

现在已经2022年了,有什么解决办法吗?

Net*_*ave 6

不能用泛型类型定义闭包吗?

不,根据2022 年和 rust 1.58,它仍然不是。

作为替代方案:

您可以在(几乎?)任何范围内定义函数,因此可以替代|a:T| -> T { a }

fn main() {
    fn id<T>(a: T) -> T {
        a
    }
    for i in 0..10 {
        println!("{}", id(i));    
        println!("{}", id("Foo"));    
    }
}
Run Code Online (Sandbox Code Playgroud)

操场

您还可以根据需要重新定义 lambda(尽管我仍然会使用函数):

fn main() {
    for i in 0..10 {
        let id = |a| a;
        println!("{}", id(i));
        let id = |a| a;
        println!("{}", id("Foo"));    
    }
}
Run Code Online (Sandbox Code Playgroud)

操场