什么是typestate?

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的缺点很简单:可组合性.

如果您仔细阅读说明,请注意:

  • 在调用函数之后,只满足它建立的谓词集(注意:按值获取的参数不受影响)

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

当新的谓词弹出时,这可能导致以指数速率复制函数:遗憾的是,谓词不是可组合的.它们本来要解决的设计问题(类型的扩散,因此功能)似乎没有得到解决.


mhd*_*mhd 13

它基本上是类型的扩展,您不仅可以检查是否允许某些操作,而是在此特定上下文中.所有那些在编译时.

原来的纸其实是相当的可读性.

  • 在Rust的LtU主题中有一些关于本文的讨论:http://lambda-the-ultimate.org/node/4009 (4认同)