34 个稳定版本 (6 个主要版本)
7.0.1 | 2023年12月15日 |
---|---|
6.2.1 | 2022年1月4日 |
6.2.0 | 2021年9月28日 |
6.1.1 | 2019年3月2日 |
1.2.6 | 2018年3月2日 |
#185 在 数据结构 中
每月 125 次下载
用于 programinduction
63KB
702 代码行
polytype
一个 Hindley-Milner 多态类型系统。通过统一实现类型推断。
用法
[dependencies]
polytype = "7.0"
polytype
提供了 TypeScheme
和 Type
枚举,Context
结构体,以及 tp!
和 ptp!
宏,这些宏有助于简洁地创建类型和类型方案。
统一
let mut ctx = Context::default();
// t1: list(int → α) ; t2: list(β → bool)
let t1 = tp!(list(tp!(@arrow[tp!(int), tp!(0)])));
let t2 = tp!(list(tp!(@arrow[tp!(1), tp!(bool)])));
ctx.unify(&t1, &t2).expect("unifies");
let t1 = t1.apply(&ctx);
let t2 = t2.apply(&ctx);
assert_eq!(t1, t2); // list(int → bool)
应用类型上下文
let mut ctx = Context::default();
// assign t0 to int
ctx.extend(0, tp!(int));
let t = tp!(list(tp!(0)));
assert_eq!(t.to_string(), "list(t0)");
let t = t.apply(&ctx);
assert_eq!(t.to_string(), "list(int)");
实例化 TypeScheme
let mut ctx = Context::default();
// ∀α. list(α)
let scheme = ptp!(3; tp!(list(tp!(3))));
// They instantiate to new fresh type variables
let t1 = scheme.instantiate(&mut ctx);
let t2 = scheme.instantiate(&mut ctx);
assert_eq!(t1.to_string(), "list(t0)");
assert_eq!(t2.to_string(), "list(t1)");
有关详细信息,请参阅文档。
功能
默认情况下,polytype
包含一个类型解析器,可以使用 str::parse 调用。可以通过 default-features = false
禁用。
依赖项
~2.3–7.5MB
~49K SLoC