質問

過負荷を支えるタイプのシステムに取り組んでいます。私はそのようなシナリオでタイプの推論がどのように実装されているかについての大まかな考えを持っていますが、タイプ推論が完了した後の - オーバーロードされたオペレータの正しい実装を選択することができます。または、言い換えれば、推論されたタイプをどのように渡すことができるかは、構文ツリーをオペレータに戻すことができます。

小さな例では、(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 のタイプabの略です。

予想される場合、指定された式の戻り型は[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のそれぞれを参照してください。このようにして、任意の情報をサブ式に「渡す」必要はありません。代わりに、すべての可能な方法で、各サブ表現はすでに注釈を付けられています。

ライセンス: CC-BY-SA帰属
所属していません cs.stackexchange
scroll top