lep*_*phe 1 polymorphism ocaml types
在玩具函数语言的解释器中,我有一个expr类型,每个算术和布尔运算符都有一个构造函数.我想将这种类型分解为:
type expr =
| Int of int
| BinaryArith of (int -> int -> int) * expr * expr
| Comparison of ('a -> 'a -> bool) * expr * expr
Run Code Online (Sandbox Code Playgroud)
但是,由于'atype参数未定义,因此不会输入.我可以完全参数化'a expr,但单个实例expr将不再提供多态行为.
最终,我的愿望是通过内置的比较操作符(<>,>=,等)的构造函数,所以我想在这里保存完整的多态性.
如果构造函数可以被视为函数,那么使得不可能的一个简单原因是Hindley-Milner类型系统仅支持"prenex"多态性.
我在这里做错了吗?有没有一种实现这种多态性的正确方法?
编辑:虽然接受者答案解决了这个问题,但在其他答案和评论中提出了更好的设计.一定要阅读它们!
它并没有完全回答你的问题,但你可能想让你的AST更具象征意义.例如:
type comparison_op = Eq | Ne | Lt | Gt | Le | Ge
type expr = ... | Comparison of comparison_op * expr * expr
Run Code Online (Sandbox Code Playgroud)
然后,当你计算表达式,你可以打电话(=)或(<=)等.