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

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

allowAdditional, extends, restricts

参考:

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の扱いとかがちょっとやっかいな問題。