データ型
データ型とは具体的なデータだけを持っている型で、メンバは整数少数文字列列挙、データ型、およびそれらの配列のみからなる。データ型は重複のない木でなければならず、インスタンスが木の中の複数ヶ所から参照されるとエラーになる。エラーを発見するために代入したり切り離したりするたびに全部に印をつけるので同じ木に属するものは全部同じIDを持つ。
XMLだのJsonだのに書き出したり戻したり出来る。名前未定のこの言語のソースコードに書きだしすことも出来、そのソースコードを実行すれば復元される。
データ型とはいうもののそのインスタンスは常にJavaやなんかでいうinterface越しにアクセスされる。具体データ型を一つ作るとインターフェースと具体クラスが作られる。
data Hoge(int ID, string Name); C#で言うと interface IHoge{ int ID{ get; set; } string Name{ get; set; } } class Hoge : IHoge{ public int ID{ get; set; } public string Name{ get; set; } }
目的
あるアプリケーションがコンポーネントABを使うとする。コンポーネントAはID,Name。コンポーネントBはID,Name,Ageを使う。アプリケーション全体ではID,Name,Age,Sexを使う。
アプリケーション全体のデータ型ID,Name,Age,Sexだけを作り、コンポーネントA,Bで使いまわす、という実装が考えられるが、コンポーネントA,Bでは関係ないデータが必要になり再利用性が損なわれる。
コンポーネントに必要なデータごとにインターフェースを作りアプリケーション全体のデータ型に多重継承させる、という実装が考えられるが、各コンポーネントが事前にインターフェースとして分離する必要があることを知っている必要がある、またデータはしばしば大量に必要になり書くのがめんどくさくなる、といった問題がある。この機能によってそれを自動化する。
また、インターフェースとか継承とかそもそもわかりにくいし使いにくいし消えて欲しい。そういった問題が解決出来る。
操作
データ型は合成出来る。
data A(int ID, string Name); data B(int ID, string Name, int Age); data App : A & B(Sex sex);
データ型は名前を合わせる事が出来る。
data App : A & B(Sex sex){ Name < A & B : HogeName; ID < A : HogeID, B : HugaID; }
コンストラクトには名前指定が強制される。
Hoge(ID = 1, Name = "Unko");