Typescript Rust right=|u a | | b | b的泛型类型实现
在TypeScript中,我执行以下操作:Typescript Rust right=|u a | | b | b的泛型类型实现,typescript,rust,typescript-generics,Typescript,Rust,Typescript Generics,在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 到目前为止,编译
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中使用泛型类型来实现这一点的合适代码是什么?这里的问题是,您的闭包不是泛型的。它们实际上是固定到特定类型的,并且这些类型是推断出来的。编译器在您第一次使用时为它们分配一次,然后它们与后续使用不匹配 如果要使用泛型类型,最好使用显式函数而不是闭包:
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
}
fn-right(x:T)->impl-fn(U)->U{
|b | b
}
fn日志(消息:T){
右(println!(“{:?}”,msg))(msg);
}
fn main(){
日志(1);//1
日志(“你好”);//你好
日志(右(1)(2));//2
}
这些函数是显式泛型的,并且具有适当的类型,因此它们将根据每个实例化的情况进行单态化。如果您对这些函数范围的增加感到不满意,可以将它们推到
main
,它们只能从那里看到,就像您的闭包一样。这里的问题是闭包不是泛型的。它们实际上是固定到特定类型的,并且这些类型是推断出来的。编译器在您第一次使用时为它们分配一次,然后它们与后续使用不匹配
如果要使用泛型类型,最好使用显式函数而不是闭包:
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
}
fn-right(x:T)->impl-fn(U)->U{
|b | b
}
fn日志(消息:T){
右(println!(“{:?}”,msg))(msg);
}
fn main(){
日志(1);//1
日志(“你好”);//你好
日志(右(1)(2));//2
}
这些函数是显式泛型的,并且具有适当的类型,因此它们将根据每个实例化的情况进行单态化。如果您对这些函数范围的增加不满意,您可以将它们推到
main
,它们将只在那里可见,就像您的闭包一样。谢谢,但我知道它不是泛型的,我想我是这样提过的,并提出了质疑。我认为main()
范围没有多大关系,但我不高兴的是你说的“如果要使用泛型类型,最好使用显式函数而不是闭包:“更好的是,我知道,闭嘴,这是一个lamda表达式。如果不可能在闭包中实现泛型,请这样说,而不是在更好的上下文中决定。谢谢。@smithK:我认为最接近您所要求的是一个闭包,它采用&dyn Display
参数。也许宏更适合您。或者实际上,只需编写{a;b}
来代替right(a)(b)
@smithK:在Rust中,泛型在编译时是单形的,以便进行静态调度;然而,这种单态化发生在功能水平上。要使闭包成为通用闭包,必须在变量级别实现单晶化。在这种情况下,为了保持静态调度,您需要使用函数而不是闭包(并且由于您的闭包没有捕获任何环境,这是绝对好的),如在这个答案中提出的,或者您将不得不考虑动态调度,例如用<代码>和Dyn任何< /代码>。谢谢,但我知道它不是通用的,我想我提到了,并提出了质疑。我认为main()
作用域并不重要,但我不高兴的是你说“如果你想使用泛型类型,最好使用显式函数而不是闭包:”。更好的是,我知道,闭包,这是一个lamda表达式。如果不可能在闭包中实现泛型,请这样说,而不是在更好的上下文中决定。谢谢。@smithK:我认为最接近您所要求的是一个闭包,它采用&dyn Display
参数。也许宏更适合您。或者实际上,只需编写{a;b}
来代替right(a)(b)
@smithK:在Rust中,泛型在编译时是单形的,以便进行静态调度;然而,这种单态化发生在功能水平上。要使闭包成为通用闭包,必须在变量级别实现单晶化。在这种情况下,为了保持静态调度,您需要使用函数而不是闭包(因为闭包没有捕获任何环境,这是绝对正确的),正如本文中所建议的,或者您将不得不考虑动态调度,例如使用<代码>和Dyn任何< /代码>。在log
函数的上下文中,在写入控制台后返回msg
会更清楚。这是否回答了您的问题@我不同意更干净的方面return
语句是额外的语句,而且很难看。清晰易维护的代码比简洁但晦涩难懂的代码漂亮一百万倍。@eggyal我已经检查过Q&a了,没有。旁白:你的right
函数基本上是实现;在log
函数的上下文中,在写入控制台后返回msg
会更清楚。这是否回答了您的问题@我不同意更干净的方面<代码>返回句子是多余的语句,而且很难看。清晰易维护的代码比简洁但晦涩难懂的代码漂亮一百万倍。@eggyal我已经检查过问答了,没有。