rust - 什么是类型状态?

标签 rust language-design rust-obsolete

TypeState 在语言设计方面指的是什么?我看到在一些关于 mozilla 的新语言 Rust 的讨论中提到了它。

最佳答案

注意: Typestate 从 Rust 中删除,只剩下一个有限的版本(跟踪未初始化和从变量中移动的)。请参阅最后我的注释。

TypeState 背后的动机是类型是不可变的,但是它们的一些属性是动态的,基于每个变量。

因此,我们的想法是创建关于类型的简单谓词,并使用编译器出于许多其他原因执行的控制流分析,以使用这些谓词静态修饰类型。

这些谓词实际上并没有被编译器本身检查,这可能太繁琐了,相反编译器会简单地根据图形进行推理。

作为一个简单的示例,您创建了一个谓词 even,如果数字是偶数,它会返回 true

现在,您创建两个函数:

  • halve,仅作用于偶数
  • double,接受任何数字,并返回一个偶数

请注意类型number 没有改变,您没有创建evennumber 类型并复制所有以前作用于number 的函数.您只需将 number 与一个名为 even 的谓词组合起来。

现在,让我们构建一些图表:

a: number -> halve(a)  #! error: `a` is not `even`

a: number, even -> halve(a)  # ok

a: number -> b = double(a) -> b: number, even

很简单,不是吗?

当然,当您有多个可能的路径时,它会变得有点复杂:

a: number -> a = double(a) -> a: number, even -> halve(a) #! error: `a` is not `even`
          \___________________________________/

这表明您是根据谓词集进行推理的:

  • 当连接两条路径时,新的谓词集是这两条路径给出的谓词集的交集

这可以通过函数的通用规则进行扩充:

  • 要调用一个函数,必须满足它所要求的谓词集
  • 调用一个函数后,只有它建立的谓词集得到满足(注意:按值取的参数不受影响)

因此 RustTypeState 的构建 block :

  • check:检查谓词是否成立,如果不失败,否则将谓词添加到谓词集

请注意,由于 Rust 要求谓词是纯函数,如果它可以证明此时谓词已经成立,它可以消除冗余的 check 调用。


Typestate 缺乏的很简单:可组合性。

如果你仔细阅读描述,你会注意到这一点:

  • after a function is called, only the set of predicates it established is satisfied (note: arguments taken by value are not affected)

这意味着类型的谓词本身是无用的,实用程序来自注释函数。因此,在现有代码库中引入新谓词很无聊,因为需要审查和调整现有功能以迎合解释它们是否需要/保留不变量。

当新谓词出现时,这可能会导致函数以指数速度重复:不幸的是,谓词不可组合。他们原本要解决的设计问题(类型的激增,因此函数)似乎没有得到解决。

关于rust - 什么是类型状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3210025/

相关文章:

rust - 改变结构体中向量内的结构体

rust - 如何使用代表 StructOpt 子命令的枚举?

javascript - 是什么阻碍了 Ruby、Python 来获得 Javascript V8 速度?

programming-languages - 没有原始 SIMD 数据类型的基本原理

c++ - 在 8 位 block 中使用变量的好方法是什么?

rust - 在 Rust 中引用一个包含结构(并调用它的方法)

enums - 在 crate 中时无法在范围内获取 Rust 枚举

mongodb - 如何通过r2d2和actix在MongoDB中保存文档?

rust - Command::new()。args()不处理数组中的多个参数