スタックに基づいて、連結パラダイムに従って、小さな単純な言語を作成することにより、連結プログラミングについて詳しく学びたいと思います。
残念ながら、私は連結言語とそれらの実装に関する多くのリソースを見つけていません。そのため、私の可能なことを前もって申し訳ありません。
したがって、私は言語を関数の連結の単純なシーケンスとして定義し、ASTでリストとして表しています。
data Operation
= Concat [Operation]
| Quotation Operation
| Var String
| Lit Literal
| LitOp LiteralOperation
data Literal
= Int Int
| Float Float
data LiteralOperation
= Add | Sub | Mul | Div
次のプログラム4 2 swap dup * +
(に対応2 * 2 + 4
)が解析されると、次のASTが得られます。
Concat [Lit (Int 4), Lit (Int 2), Var "swap", Var "dup", LitOp Mul, LitOp Add]
次に、タイプを推測して確認する必要があります。
私はこの型システムを書きました:
data Type
= TBasic BasicType -- 'Int' or 'Float'
| TVar String -- Variable type
| TQuoteE String -- Empty stack, noted 'A'
| TQuote String Type -- Non empty stack, noted 'A t'
| TConc Type Type -- A type for the concatenation
| TFun Type Type -- The type of functions
それが私の質問の出番です。なぜなら、その式から推測するタイプがわからないからです。結果の型は明白ですがInt
、型レベルでこのプログラムを実際に完全にチェックする方法がわかりません。
最初は、上記のように、TConc
型がTFun
関数を表すのと同じ方法で連結を表す型について考えました。結局、連結シーケンスは一意の関数を形成するためです。
まだ検討していない別のオプションは、この式シーケンスの各要素に関数構成推論規則を適用することです。スタックベースでどのように機能するかわかりません。
問題はそうです:どうやってそれを行うのですか?使用するアルゴリズム、および型レベルでのどのアプローチを優先する必要がありますか?