Здравствуйте, samius, Вы писали:
S>Я бы объяснил это проще, тем что ООП натягивали на процедурные языки во времена когда было популярно экономить на вызовах, куда уж говорить о создании объекта на каждый вызов.
Объект мог быть создан на стеке и передан по ссылке...
S>Отчасти поэтому мы и имеем кучу работы с сингатурами,
Ну так сигнатуру аргументов и возвращаемого значения можно рассматривать как некий автообъявляемый тип-тупл. Собсно, в С++ сигнатура ф-ии/метода и есть полноценный тип, в отличие от дотнета.
S>сложными правилами совместимости
ИМХО, никаких сложностей: ковариантность и контрвариантность зависит от направления аргумента в сигнатуре in/out, т.е. возвращаемое значение ничем от out аргумента в этом плане не отличается. Сложно запутаться.
S>и прочим, вплоть до несовместимости Func/Action в C#.
Да, в дотнете делегаты не абстрактные типы, а вполне конкретные. За это их пинали с самого начала. Даже напиши рядом такой же Action2 через copy&paste и он будет несовместим с исходным Action.
S>В ФП с более накладным применением аргументов все как-то намного проще.
Тебе проще из-за абстрактности функциональных типов + обобщенного программирования. Это фишка конкретного языка, а не ФП как такового.