オーバーロード付きの型推論
-
29-09-2020 - |
質問
過負荷を支えるタイプのシステムに取り組んでいます。私はそのようなシナリオでタイプの推論がどのように実装されているかについての大まかな考えを持っていますが、タイプ推論が完了した後の - オーバーロードされたオペレータの正しい実装を選択することができます。または、言い換えれば、推論されたタイプをどのように渡すことができるかは、構文ツリーをオペレータに戻すことができます。
小さな例では、(x + y) + 1
の表現x :: N | S, y :: a, + :: (N -> N -> N) | (S -> S -> S), 1 :: N
を考えます。 ::
はのタイプのの種類、およびa | b
型は、a
またはタイプのb
の略称です。
想定、入力推論は機能し、構文ツリーをトラバースすることであり、各ノードの型制約を返す:
(x + y) + 1 => ((N & (N[a=N] | S[a=S])), (N & N) -> N) | ((S & (N[a=N] | S[a=S])), (S & N) -> S) => N[a=N]
1 => N
+ => (N -> N -> N) | (S -> S -> S)
x + y => ((N & (N | S)), (N & a) -> N) | ((S & (N | S)), (S & a) -> S) => N[a=N] | S[a=S]
x => N | S
y => a
+ => (N -> N -> N) | (S -> S -> S)
.
a & b
この例では、 Unifying のタイプa
とb
の略です。
予想される場合、指定された式の戻り型は[a=T, b=U]
、つまり型変数N[a=N]
がN
であると予想されるa
として推測されます。
そのため、N
演算子(+
、N -> N -> N
)に提供されている2つの実装の有無を使用してください。与えられた例では、結果のタイプは推測されますが、オーバーロードされたオペレーターの型は推測されません。私の質問は、使用されている実装の構文ツリーにS -> S -> S
ノードに通知するために使用される一般的なパターンがある場合です。
解決
次のように型推論を整理することができます。
入力構文にはInput
があるとします。Output
のように、すべての変数に明示的なタイプの注釈を持つ出力構文Input
を定義します。型推論はタイプ
infer : Input -> List (Output * Type)
.
それは、いくつかの入力e
を考えると、可能な答えのリストを返します。各回答は、(e', t)
がタイプ別に注釈付き変数を持つe'
とペアCENSICETAGCODEで、e
は推論されたt
です。
このことが無限主義のモナドで存在するようにこれを見ることができます。変数e
の型を推測する必要があるときはいつでも、その可能なタイプがx
とBranchのそれぞれを参照してください。このようにして、任意の情報をサブ式に「渡す」必要はありません。代わりに、すべての可能な方法で、各サブ表現はすでに注釈を付けられています。