Здравствуйте, VladD2, Вы писали:
VD>Это зависит от того, что понимается под термином "частичный вывод типов"
.
Не обращайте внимания. Я слабо знаком с теорией языков программирования поэтому не знаю многих терминов.
VD>А вообще, то что ты хочешь добиться называется "rank-2 polymorphism" полиморфизм. В чистом виде его в Nemerle нет, так что как бы крут вывод типов не был, он не сможет позволить передавать в качестве параметра типов обобщенный тип вместе с параметрами типов. Ну, разве что с констрэйнами поизвращаться, как в твоем примере.
VD> ...
VD>Не уверен, что прав на 100%. Тут лучше получить консультацию Nikov-а (который, похоже, всех собак в округе поел по этому поводу). Но полная реализация "rank-2 polymorphism" на дотнете невозможна. Можно реализовать только некоторые фишки.
VD> ...
VD>Опять же сначала нужно понять что является конечной целью задачи? Если задача — создание универсальной фабрики, то она решается в сто раз проще.
Исходную задачу Вы поняли абсолютно верно. Нужна универсальная фабрика. Вторая задача, возникшая по дороге — понять, какие подходы можно использовать, если решать на Nemerle.
VD> Нужно просто передавать функцию создающую нужный объект в качестве параметра вашей фабрике. Упрощенно это можно показать так. Меняем реализацию Create на ...
VD> ... Т.е. вместо параметра типов передаем функции конструктор который будет создавать тип.
Решение очень понравилось!
VD>Как бонус получим резкое ускорение создания дерева, так как будет избавимся от создания его экземпляров через Activator.CreateInstance(), который используется при указании констрэйна new(). Activator.CreateInstance — очень медленный. Если вызовов будет много, можно получить конкретные тормоза.
Это тоже отличная новость, потому что не знал, как избежать дорогого Activator.CreateInstance() в C#.
VD>Макросами можно решить почти любую проблему. В частности можно написать макру которая будет вставлять все параметры типов автоматом и как надо.
Именно такой подход я себе и представлял. Про макросы обязательно буду читать позднее, потому что порой их сильно не хватает в C#.
VD>Всегда есть более простые и эффективные решения. Но их можно подобрать только если знаешь конкретную задачу. Так что лучше начать от печки и описать — что привело ко всем этим наворотам.
Это одна из причин, по которым я задал тут вопрос. Во-первых, хотел увидеть какие мысли возникнут у адептов Nemerle. Во-вторых, посмотреть насколько силён вывод типов, какие есть ограничения и какие трюки.
Сама же печка озвучена в исходном сообщении. Потребовалось обернуть семейство типов в общую обёртку. Конечно, этот конкретный пример несколько надуманный, но он помог мне узнать много нового.