1 个不稳定版本
0.3.0 | 2021年5月24日 |
---|
#1700 在 数学
530KB
12K SLoC
算术文法的类型推断
arithmetic-parser
crate 对算术表达式进行Hindley–Milner类型推断。
此crate允许将类型注解作为语法的一部分进行解析,并为arithmetic-parser
产生的AST推断/检查类型。类型推断与arithmetic-eval
的解析器部分兼容;如果推断算法在某个表达式/语句/块上成功,它将成功执行,但并非所有成功执行的项都能通过类型推断。
使用方法
将以下内容添加到您的Crate.toml
[dependencies]
arithmetic-typing = "0.3.0"
快速概览
类型系统支持arithmetic-parser
的所有主要构造,如元组、对象和函数类型。函数和算术运算可以对涉及的类型施加约束,这与Rust特质类似(除了更加有限)。动态类型/特质对象也有相应的支持。最后,可以使用any
类型来绕过类型系统限制。
类型系统对原始类型是泛型的。这允许定制算术运算和约束的处理,与arithmetic-eval
crate中的Arithmetic
类似。
对于简单的脚本,类型推断可能在没有任何注解的情况下成功。在下面的示例中,仅在test类型推断上添加了注释,而不是驱动它。
minmax: ([Num; N]) -> { max: Num, min: Num } =
|xs| xs.fold(#{ min: INF, max: -INF }, |acc, x| #{
min: if(x < acc.min, x, acc.min),
max: if(x > acc.max, x, acc.max),
});
assert_eq((3, 7, 2, 4).minmax().min, 2);
assert_eq((5, -4, 6, 9, 1).minmax(), #{ min: -4, max: 9 });
INF_PT = #{ x: INF, y: INF };
min_point: ([{ x: Num, y: Num }; N]) -> { x: Num, y: Num } =
|points| points
.map(|pt| (pt, pt.x * pt.x + pt.y * pt.y))
.fold(
#{ min_r: INF, pt: INF_PT },
|acc, (pt, r)| if(r < acc.min_r, #{ min_r: r, pt }, acc),
)
.pt;
assert_eq(
array(10, |x| #{ x, y: 10 - x }).min_point(),
#{ x: 5, y: 5 }
);
有关类型表示法和更多使用示例,请参阅crate文档和示例。
缺失或不完整的特性
- 求和/标签联合类型
- 超出最简单类型的类型约束
- 在类型注解中指定类型变量(超出最简单情况)
- 类型别名
另请参阅
arithmetic-eval
是一个简单的解释器,可以用于本软件包消费的 AST。
许可证
根据您的选择,在Apache License, Version 2.0 或 MIT 许可证下获得许可。
除非您明确声明,否则您提交给 arithmetic-typing
的任何贡献(根据 Apache-2.0 许可证定义),均将按照上述方式双许可,不附加任何额外条款或条件。
依赖项
~2.5MB
~54K SLoC