gpt4 book ai didi

typescript - 用于right = | _a |的Rust泛型类型实现| b | b

转载 作者:行者123 更新时间:2023-12-03 11:42:50 25 4
gpt4 key购买 nike

在TypeScript中,我这样做:

const right = <T>(a: T) => <U>(b: U) => b;

const log = (msg: unknown) =>
right
(console.log(msg))
(msg);

log(1); // 1
log("hello"); // "hello"
log(right(1)(2)); // 2
现在,我想用通用类型在Rust中实现相同的代码。
let right = |_a| |b| b;

let log = |msg| right(println!("{:?}", msg))(msg);

log(1); // 1
log("hello"); // compile error
log(right(1)(2)); // compile error
到目前为止,编译错误是这样的,我知道错误发生的原因和方式,并且我知道这不是使用泛型的代码。
所以我的问题是,使用泛型类型 闭包在Rust中实现此功能的合适代码是什么?

最佳答案

这里的问题是您的闭包不是通用的。实际上,它们固定为特定类型,并且可以推断出那些类型。第一次使用时,编译器将它们分配一次,然后它们与以后的使用不匹配。
如果要使用泛型类型,最好使用显式函数而不是闭包:

fn right<T, U>(_x: T) -> impl Fn(U) -> U {
|b| b
}

fn log<T: std::fmt::Debug>(msg: T) {
right(println!("{:?}", msg))(msg);
}

fn main() {
log(1); // 1
log("hello"); // hello
log(right(1)(2)); // 2
}
这些函数是显式泛型的,并已适当类型化,因此对于每个实例化,它们将被适当化。如果您对这些功能的扩展范围不满意,可以将它们插入 main,并且仅从那里可以看到它们,就像您的闭包一样。

关于typescript - 用于right = | _a |的Rust泛型类型实现| b | b,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63839599/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com