Здравствуйте, DarkGray, Вы писали:
S>>И какая по-твоему польза от мнимой параметричности первой функции? Может она стала типобезопасной? Где бенефит?
DG>Эта функция инкапсулирует внутри себя ad-hoc полиморфизм, позволяя записывать более сложные параметрические полиморфизмы простым образом.
DG>Например, Сnk можно записать так
Записать можно. Но это не параметрическое решение. Параметрический полиморфизм должен работать для всех типов. А единственное, на что годится это "параметрическое" решение — на поставку данных для ad-hoc-а. Т.е. назвать это решение параметрическим решением Cnk — нельзя.
Хочешь избавиться от ad-hoc — вынеси любое проявление диспетчеризации из кода. Например, так:
T Cnk<T>(T n, T k, T one, Func<T,T,T> add, Func<T,T,T> mul, Func<T,T,T> div, Func<T,T,bool> lte)
Можно собрать все операции в один класс, но тогда получишь тоже не чистое параметрическое решение, а замес либо с subtype либо с bounded полиморфизмами.
Я не утверждаю что твой Cnk никуда не годный. Просто это не параметрически полиморфное решение. И прийти к нему тебе позволила не инкапсуляция ad-hoc полиморфизма, а переход от early bound ad-hoc-а к late bound ad-hoc.