Ocaml - 具有多态参数的构造函数

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"多态性.

我在这里做错了吗?有没有一种实现这种多态性的正确方法?

编辑:虽然接受者答案解决了这个问题,但在其他答案和评论中提出了更好的设计.一定要阅读它们!

Éti*_*lon 5

它并没有完全回答你的问题,但你可能想让你的AST更具象征意义.例如:

type comparison_op = Eq | Ne | Lt | Gt | Le | Ge

type expr = ... | Comparison of comparison_op * expr * expr
Run Code Online (Sandbox Code Playgroud)

然后,当你计算表达式,你可以打电话(=)(<=)等.