我注意到,在执行代码单态化的语言(例如:C++、Rust 等)中实现多态递归类型即使不是不可能,也是非常困难的。这通常是因为编译器需要为该类型的每个可能的实例化生成代码,这通常会导致无限递归。
支持此功能的语言通常使用类型擦除。编译器不会尝试实例化下一个递归调用,因为它已经知道类型的布局。
Julia 执行代码单态化,但它支持多态递归。我的猜测是,它是通过延迟实例化泛型类型或函数直到实际调用它来实现这一点的。但是,我认为这可能最终会使用大量内存,特别是当递归非常深时。所以我的问题是,Julia 是否仍会对多态递归类型执行代码单态化,还是会退回到类型擦除或其他方法?
在下面的代码中:
enum Either<A, B> { Left(A), Right(B) }
use Either::{Left, Right};
impl<A, B> From<A> for Either<A, B> {
fn from(a: A) -> Self {
Left(a)
}
}
impl<A, B> From<B> for Either<A, B> {
fn from(b: B) -> Self {
Right(b)
}
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:“std::convert::From<_>类型特征的实现冲突Either<_, _>”。From<A>我不明白和From<B>for的实现Either<A, B>是如何冲突的。
我在标准库文档中看到了一个示例,其中他们所做的几乎与我正在做的完全一样,但它在那里工作:
use std::fs;
use std::io;
use std::num;
enum CliError {
IoError(io::Error),
ParseError(num::ParseIntError),
}
impl From<io::Error> for CliError {
fn from(error: io::Error) -> Self { …Run Code Online (Sandbox Code Playgroud)