主要观点:在函数式编程中,“Tagless Final”模式是创建嵌入式领域特定语言(DSL)的良好抽象,Rust 作为系统语言需能采用此类高级抽象且不牺牲零成本性能,本文探索在 Rust 中实现该模式的“tagless initial”变体。
关键信息:
- “Tagless Initial”编码用 GADT 表示表达式,如在 Haskell 中的示例。
- Rust 中通过特定函数构建复杂表达式并编译后,其表达式树等被优化为一系列算术指令,实现“零成本”。
- 评估逻辑在
Eval
trait 中,通过match
语句递归调用eval
,关键在于Gadt
和Enum
类型的定义。 - 核心技术是使用
never
类型的enum
,确保在给定类型签名下只有一个变体可构造,编译器可在编译时确定使用的变体,实现零成本优化。 Cursor
和Attic
特质作为类型级配置系统,协同工作控制Gadt
的构造和模式匹配。- 实验证明
never
类型是实现无标签和编译器优化的关键组件,简单的#[inline(always)]
并非可靠解决方案。
重要细节: - Rust 中
Gadt
的定义及各构造函数的实现,如int_const
、lambda
、apply
、add
等。 Eval
trait 中eval
函数的具体匹配逻辑。Enum
类型中各变体的定义及与never
类型的结合方式。Attic
和Cursor
特质中各种类型关联的默认设置及作用。- 实验中改变
Attic
特质导致编译器行为变化及生成的不同汇编代码。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。