このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

各レベルの構成子、演算記号

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では他に制限(スキーマ属性、一種の内包記法)とバッグ型がある。バッグ型は扱いがかなり異なる。

リフト(レベルを上げて埋め込む)を行う関数は以下のとおり。

  1. sing : D0 → D1 シングルトン型
  2. just : D1 → D2 シングルトンカインド
  3. lower : D1 → D2 下方集合
  4. 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