Меня преследуют странные мысли о полиморфизме высших порядков (rank-2 и rank-n) и тайпклассах. Мне привиделось, что можназделоть что-то такое на макросах в Nemerle и теперь голова этим забита. То есть какой-то синтаксис, например poly
def t1 = poly T[_]; // T1 [ T2 ]
def t2 = poly T[_ , _]; // T1 [ T2, T3 ]
def t3 = poly T[int, _]; // T1 [int, T2]
по ентой записи делает представление . Примерно как дотнеты хранят как-то информация о generic-параметрах
WriteLine(typeof(Dictionary.[_,_]));
//System.Collections.Generic.Dictionary`2[TKey,TValue]
WriteLine(typeof(Dictionary.[string,int]));
//System.Collections.Generic.Dictionary`2[System.String,System.Int32]
Так и мне надо изобразить что-то такое. То есть сохранить информацию о типах-параметрах в какую-нибудь свой класс PolyType, а потом применять
def с1 = t1 apply [List]; // List[T2]
def r1 = с1 apply [int]; // List[int]
И у apply должен быть тип PolyType -> YobaType, где YobaType - это тип-вариант из PolyType (если у нас все еще слишком неконкретные для дотнета типы) и System.Type (когда тип стал конкретным, надо бы его прямо в код поставить).
И надо сделать такие вот тайпклассы
typeclass Functor [ poly C[_] ] {
abstract fmap[a,b](f: a->b, c: C[a]) : C[b];
}
И все это дело будет превращаться в контейнер с квази-циатами. Будут хранится типы-параметры в виде YobaType, будут хранится сигнатуры методов, а также тела методов, если они не объявлены как abstract. И затем можна будет использовать все это дело каким-то макро аттрибутом вроде
[ instance Functor[List] ]
module ListF { }
И тогда в ентот модуль ListF будут переписаны, все методы из Functor, сигнатуры будут конкретизированы List. Для методов помеченных abstract в базовом классе будет выдана ошибка с требованием реализовать такой-то метод. Методы, имеющие тела в базовом классе, будут переписаны в дочерний, если в том уже не содержится метод с данным именем и данной сигнатурой. Понавешать атрибутов [instance] на один модуль можно много, потому могут возникать конфликты. На самом деле, это не так серьезно, как может показаться, поскольку Nemerle умеет в перегрузку методов (в отличии от некоторых), потому конфликтовать будут только методы с одинаковой сигнатурой и именем, да и то если они они имеют реализацию в базовых классах. Ну и тут надо, как-то выкрутился, но я пока не понял как. Мне думает, это скорее вопрос соглашений, так как информации достаточно и реализовать-то можно всякое поведение.
И вот пытаюсь сделать что-то такое и до
wizzard0 докопался и до чатика. Пока еще даже не определился, как должны PolyType и YobaType выглядеть. Также мучает вопрос "а не поехал ли я", но тут без разницы, если действительно можназделоть.