Re[2]: Упёрся в ограничения вывода типов или что-то упустил?
От: KeyKeeper Россия  
Дата: 30.11.11 10:56
Оценка:
Здравствуйте, 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. Во-вторых, посмотреть насколько силён вывод типов, какие есть ограничения и какие трюки.
Сама же печка озвучена в исходном сообщении. Потребовалось обернуть семейство типов в общую обёртку. Конечно, этот конкретный пример несколько надуманный, но он помог мне узнать много нового.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.