Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript Rust right=|u a | | b | b的泛型类型实现_Typescript_Rust_Typescript Generics - Fatal编程技术网

Typescript Rust right=|u a | | b | b的泛型类型实现

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 到目前为止,编译

在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中使用泛型类型来实现这一点的合适代码是什么?

这里的问题是,您的闭包不是泛型的。它们实际上是固定到特定类型的,并且这些类型是推断出来的。编译器在您第一次使用时为它们分配一次,然后它们与后续使用不匹配

如果要使用泛型类型,最好使用显式函数而不是闭包:

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我已经检查过问答了,没有。