Bra*_*Guy 46 language-design rust rust-obsolete
TypeState在语言设计方面提到了什么?我在一些关于mozilla称为Rust的新语言的讨论中看到了它.
Mat*_* M. 43
注意: Typestate从Rust中删除,只剩下一个有限的版本(跟踪未初始化并从变量移动).最后看我的笔记.
TypeState背后的动机是类型是不可变的,但是它们的一些属性是动态的,基于每个变量.
因此,我们的想法是创建关于类型的简单谓词,并使用编译器执行的控制流分析,其中有许多其他原因用这些谓词静态地修饰类型.
这些谓词实际上并没有被编译器本身检查过,它可能过于繁琐,而编译器只是在图形方面的原因.
举个简单的例子,你创建一个谓词even,true如果数字是偶数则返回.
现在,您创建了两个函数:
halve,只对even数字起作用double,取任何数字,并返回一个even数字.请注意,类型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
Run Code Online (Sandbox Code Playgroud)
简单,不是吗?
当然,当你有几条可能的路径时,它会变得有点复杂:
a: number -> a = double(a) -> a: number, even -> halve(a) #! error: `a` is not `even`
\___________________________________/
Run Code Online (Sandbox Code Playgroud)
这表明您根据谓词集来推理:
这可以通过函数的通用规则来扩充:
和这样的积木TypeState在拉斯特:
check:检查谓词是否成立,如果不成立,则将fail谓词添加到谓词集请注意,由于Rust要求谓词是纯函数,因此check如果它可以证明谓词已经存在,则它可以消除冗余调用.
Typestate的缺点很简单:可组合性.
如果您仔细阅读说明,请注意:
- 在调用函数之后,只满足它建立的谓词集(注意:按值获取的参数不受影响)
这意味着类型的谓词本身是无用的,实用程序来自注释函数.因此,在现有代码库中引入新谓词是一个难题,因为需要审查和调整现有函数以解释它们是否需要/保留不变量.
当新的谓词弹出时,这可能导致以指数速率复制函数:遗憾的是,谓词不是可组合的.它们本来要解决的设计问题(类型的扩散,因此功能)似乎没有得到解决.