跑步
type expression =
| Num of int
| Var of string
| Let of string * expression * expression
| Binop of string * expression * expression;;
在一个 utop 会话中大约需要 8 秒。
现在,如果我们跳到一个单独的utop 会话并运行
type expression =
| Num of int
| Var of string
| Let of string * expression * expression * expression * expression
| Binop of string * expression * expression;;
这大约需要 13 秒。
最后,让我们在同一个会话中做这两个
type expression =
| Num of int
| Var of string
| Let of string * expression * expression
| Binop of string * expression * expression;;
type expression_1 =
| Num of int
| Var of string
| Let of string * expression_1 * expression_1 * expression_1 * expression_1
| Binop of string * expression_1 * expression_1;;
第一种和单独会话一样需要 8 秒,但之前的 13 秒操作现在是 3 秒!这里发生了什么?
我对 OCaml 对类型所做的所有工作知之甚少。也许它能够通过一些智能缓存从 2 表达式树构造 4 表达式树?
还是更精细的东西?
例如,由于我的自定义类型在这两种情况下都有递归组件,它是否检查是否expression_1
并expression
具有某种“结构”相似性?随着编译器在程序中注释和统一类型,当它遇到新类型时可能有几个选项(不是双关语):它是否使用显式预定义的类型,这些类型被注释为推断手头类型的线索,还是它会遍历它知道的类型,然后是我定义的自定义类型?
编译器是否最初评估某种类型,然后提出一个表示来检查它是否是某种类型?在这个例子中,是不是将所有...的递归结构构造expression * expression
成一棵树?
我真的不知道,但我想知道!