ランニング
type expression =
| Num of int
| Var of string
| Let of string * expression * expression
| Binop of string * expression * expression;;
1 回の 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
... の再帰構造をツリーに構築していますか?
よくわからないけど知りたい!