多相種とGenericDerivingの関係について
そっか。データ型を型レベルに昇格させる機能があれば、Generic Deriving で使われる多くのデータ型をいくつかの少ないのデータ型に集約させることができますね。 http://t.co/Ql6ZukJm
2011-12-15 15:00:57@eldesh あ、今は :+: を除き型とデータ構成子を一体一対応で定義したり、「data P」のようなデータ型を構成子を持たない空の型として定義したりしていますが、
2011-12-15 15:28:22@eldesh データ型を型レベルに昇格させる機能があれば(データ構成子をデータ型として扱うことができるようになるので)、そんなことをしなくても、各データ構成子を Universe や MetaData のような少数のデータ型に属するものとしてまとめることができるということです。
2011-12-15 15:31:30@eldesh 例えば、リンク先のアイデアでは「data MetaData = C | D | S」というデータ型の定義が書かれていますが、(PolyKinds 言語拡張を使えば)ここで定義されているCやD、Sというデータ構成子をデータ型として型宣言の部分で書くことができます。
2011-12-15 15:35:24@eldesh あと、データ型の種を合わせるために便宜的に利用していたデータ型に関しては、(同じく PolyKinds 言語拡張で)「k -> *」のような多相種が扱えるようになったことにより要らなくなる可能性がありますね。
2011-12-15 15:40:11@shelarcy :+: とかPとかを特別な(deriving用の)型として与えておかなくても、Universe型の構成子として普通の型のように定義出来る…?
2011-12-15 15:52:38@eldesh Universe 型のデータ構成子として提供した :+: とか P を、Generic Deriving のユーザーは従来の :+: 型や P 型として利用できるという意味であるなら、そうです。
2011-12-15 16:07:52@eldesh Universe 型に所属させる利点は、P や :+: のような型の利用方法の間違いが種によって(分かりやすく)区別できるようになることです。
2011-12-15 17:27:26@eldesh これまで:+:型には「* -> * -> *」という引数の数以外の制約は含まれていませんでしたが、Universeのデータ構成子として定義とすることで「Universe k -> Universe k -> Universe k」という明確な種を持つことになります
2011-12-15 17:29:57@eldesh e.g. (AnyK = 種変数です。) > :kind (:+:) (:+:) :: Universe AnyK -> Universe AnyK -> Universe AnyK > :kind P P :: Nat -> Universe AnyK
2011-12-15 17:34:51@eldesh .。oO(:kind は種を調べるコマンドです。型を調べるコマンドではありません。念のため。あと、「data Nat = Zero | Succ Nat」としてます。この定義では、P 型が P と P1 型を一つにまとめた形になってますね。)
2011-12-15 17:38:49@shelarcy 「利用方法の間違いによって~」というのは、Universe型に含まれる構成子(?)から成る型のみについてderiving(が定義)出来るから、ということでしょうか?
2011-12-15 17:43:20@eldesh Generic Deriving でインスタンスを導出したいクラス(例えば GShow)の定義が正しいかどうかを検査するのに、現在の引数しか情報のない種では情報が少なすぎますよね?、ぐらいの意味です。
2011-12-15 17:47:39@eldesh データ型を型レベルに昇格させる機能を Generic Deriving の例とで考えると、一度に複数のことを考えないといけなくなって難しくなるのだと思います。
2011-12-15 17:52:40@eldesh 例えば型レベル自然数の例 [http://t.co/fdxzNtPm http://t.co/UbwUx3bq ] だと、「data Zero; data Succ n」ではなく「data Nat = Zero | Succ Nat」と書けるようになって、
2011-12-15 17:55:03@eldesh * という種ではなく Nat という種をつかうことで、型レベル自然数が入ってくるべきところにそうでない型が入ってくるようなプログラムを種のエラーとして弾ける、これがすべてです。
2011-12-15 17:56:17あぁ、わかった。universeは名前通り全部入りだからバリエーションが思い付かなかったけど、nat見るといくらでも面白いことになりそうな気がする。
2011-12-15 20:11:36