Rust 了解锈蚀和类型系统

Rust 了解锈蚀和类型系统,rust,type-systems,Rust,Type Systems,来自ML家族并学会了用SML编程,一个非常严格的类型系统是常见的 我正在努力学习Rust,因为我习惯了强类型语言,所以我是一名计算机科学专业的学生,主修编译器理论和编程语言理论。我想我只是跳过了那些无聊的hello world简介。目前,我正试图了解在我的范围内具有泛型和生存期的类型系统 对于一个简单的项目,我正在实现一个单一的链表库,因为我错过了它,它会让我感觉到类型系统是如何工作的。我使用引用/借用而不是装箱来保持堆栈上的内容,因此需要在列表节点超出范围时显式地告诉编译器 pub enum

来自ML家族并学会了用SML编程,一个非常严格的类型系统是常见的

我正在努力学习Rust,因为我习惯了强类型语言,所以我是一名计算机科学专业的学生,主修编译器理论和编程语言理论。我想我只是跳过了那些无聊的hello world简介。目前,我正试图了解在我的范围内具有泛型和生存期的类型系统

对于一个简单的项目,我正在实现一个单一的链表库,因为我错过了它,它会让我感觉到类型系统是如何工作的。我使用引用/借用而不是装箱来保持堆栈上的内容,因此需要在列表节点超出范围时显式地告诉编译器

pub enum List<'a, L> {
    Cons(L,  &'a List<'a, L>),
    Nil,
}

impl<'a, L, S> List<'a, L> {
//          ^ unconstrained type parameter // error here
    pub fn new() -> List<'a,L> { 
        &List::Nil 
    }

    pub fn fold(f : fn(S, L) -> S, acc : S, lst : List<'a,L>) -> S {
        match lst {
            List::Cons(item, rest) => fold(f, f(acc,item), rest),
            List::Nil => acc,
        }
    }
}
发布枚举列表{
&列表::无
}

pub-fn fold(f:fn(S,L)->S,acc:S,lst:List生命期和
impl
上声明的泛型用于相应的类型或特征

如果要在方法上使用泛型,则必须在其中声明它们:

pub fn fold<S>(f : fn(S, L) -> S, acc : S, lst : List<'a,L>) -> S {
//         ^^^
    match lst {
        List::Cons(item, rest) => fold(f, f(acc,item), rest),
        List::Nil => acc,
    }
}

pub-fn折叠(f:fn(S,L)->S,acc:S,lst:list类型参数应该在
折叠
上,因为它是特定于函数的,而不是在
impl
上,即
fn折叠
。类型系统的一个问题是类型参数受到约束,而更多的是一个有意识的决定,以防止类似的错误。您可以将参数视为JU不喜欢参数(对于类型或函数),因此应该与定义相关联。没有理由允许类型参数像这样不受约束。