各レベルの構成子、演算記号
Array, VarArrayは可変引数、Object, VarObject, Unionは名前付き引数になる。
レベル0 | レベル1 | レベル2 |
---|---|---|
Array | Array | Array |
Object | Object | Object |
Tagged | Tagged | Tagged |
- | Opt | Opt |
- | VarArray | VarArray |
- | VarObject | VarObject |
- | Union | Union |
- | Intersect | Intersect |
- | XMerge | XMerge |
- | - | or 合并 |
- | - | and 共通部分 |
- | - | without 差集合 |
レベル1では他に制限(スキーマ属性、一種の内包記法)とバッグ型がある。バッグ型は扱いがかなり異なる。
リフト(レベルを上げて埋め込む)を行う関数は以下のとおり。
- sing : D0 → D1 シングルトン型
- just : D1 → D2 シングルトンカインド
- lower : D1 → D2 下方集合
- upper : D1 → D2 上方集合
記号的な表現は:
名前 | 演算記号 |
---|---|
Array | [-, -, ...] |
Object | {"a":-, "b":-, ...} |
Tagged | @ - - |
Opt | - ? |
VarArray | [-, -, ..., -*] |
VarObject | {"a":-, "b":-, ..., *:-} |
Union | (@a - | @b - | ...) |
Intersect | - & - |
XMerge | - ++ - |
制限は -(-), バッグ型は {[ ... ]}。あっ、VarUnionを実装しないとな。
例:
- Array(integer, boolean?) ≡ [integer, boolean?]
- Object("a":boolean, "b":number?) ≡ {"a":boolean, "b":number?}
- Tagged("foo", integer) ≡ @foo integer
- Opt(null) ≡ null?
- VarArray(integer, boolean?, string) ≡ [integer, boolean?, string*]
- VarObject("a":boolean, "b":number?, *:string?) ≡ {"a":boolean, "b":number?, *:string?}
- Union("a":boolean, "b":number) ≡ (@a boolena | @b number)
- Intersect(integer, number) ≡ integer & number
- XMerge(foo, bar) ≡ foo ++ bar