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数据结构

Download history 19/week @ 2024-03-31 6/week @ 2024-05-19 5/week @ 2024-05-26 5/week @ 2024-06-02 1/week @ 2024-06-09 1/week @ 2024-06-16 64/week @ 2024-06-23 36/week @ 2024-06-30 24/week @ 2024-07-07 1/week @ 2024-07-14

每月 125 次下载
用于 programinduction

MIT 许可证

63KB
702 代码行

polytype

Build Status crates.io docs.rs

一个 Hindley-Milner 多态类型系统。通过统一实现类型推断。

用法

[dependencies]
polytype = "7.0"

polytype 提供了 TypeSchemeType 枚举,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