allowAdditional, extends, restricts
参考:
- イイカゲンな型システムを求めて - 檜山正幸のキマイラ飼育記 (はてなBlog)
- イイカゲンな型推論を求めて - 檜山正幸のキマイラ飼育記 (はてなBlog)
- JSONスキーマのローカル構文に関する思案・試案 - 檜山正幸のキマイラ飼育記 (はてなBlog)
JSON型システムのことだが、JSONスキーマのadditionalPropertiesはオーバースペックで、あれはいらない気がしてきた。true, falseの値をとるスキーマ属性 allowAdditional があればそれで十分だろう。プロパティワイルドカードも不要になる。デフォルト値は true。allowAdditional = false だと、finalと似てる。が、まったく変更不可能なわけではなくて、既に存在するプロパティの型を強く(厳しく)することはできる。
型システムをorder sortedにしたいなら、単一継承は許すことにして、継承辺(アーク)をinclusion morphismと考えればいいだろう。多重継承を許すと、継承辺から作った自由圏がinclusive subcategoryにならないからダメ。
型Aのインスタンス領域を仮に[A]で表すとして、A extends B のとき、[A]⊆[B] となる。extendsと言いながら、領域は縮小しているから注意! 弁別子付きユニオン型にも extends と同じメカニズムを入れたい。これは restricts として、次のように書く。
@type userId = case {"handle" => string, "num" => integer}@type userNumber = case(restricts = userId)
{"handle" =>never, "num" => integer(minimum = 0)}
userNumber restricts userId という関係ができる。extendsとrestrictsは反対のようだが、実は同じで、A restricts B ならば、[A]⊆[B]。
直積に対応するobject構成と、直和に対応するcase構成があって、extends/restricts宣言によりinclusion構造ができるから、包含的半環的圏(inclusive semiringal category)ができる。圏の結合以外に、包含を利用した弱結合(weak composition)を考えると、それがパイプ結合になるだろう。
現実的にはnullの扱いとかがちょっとやっかいな問題。