Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, VoidEx, Вы писали:
VE>>Тогда if-else тоже динамическая типизация.
V>Если при этом проверяется внутреннее устройство данных, то бишь их тип — несомненно.
Т.е. всегда. Ибо в чём фундаментальное отличие нижеприведённых примеров?
if (x < 0)
foo1(x) // x is (a:int){a<0}
else
foo2(x) // x is (a:int){a>=0}
if (isChild1(p))
foo3(p) // x is Child1*
else
foo4(p) // x is Child2*
Вы могли бы сказать, что в первом случае у нас используется само число, в во втором доступ к членам, но
1. Это далеко не всегда так, может, foo3 и foo4 этот указатель в списки добавляют
2. Разницы всё равно нет, так как foo1 и foo2 могут на основе значения бегать по таблицам, использовать числа как смещения и т.п. Грубо говоря вообще можно написать такой код, что foo1 и foo2 будут через таблицы эмулировать доступы в объектам.
VE>>Во-первых, как это нету?
V>Так что нету. Потому что нет параметризации типов константами и нет compile-time диспетчеризации по этим константам и нет частичного или явного инстанциирования шаблонных типов для конкретных комбинаций аргументов. Есть только такое инстанциирование для ф-ий.
Чой-то нету-то? Там вообще макросы есть, если что.
VE>>Во-вторых, можно пример, когда static_if не является сам по себе костылём?
V>Ха. Тогда любая статическая система типов — это костыль сам по себе, т.к. это способ перенести ограничения прикладной логики на компилятор.
Неверное обобщение. Если static_if используется для диспетчеризации, то для этого есть и другие механизмы. При этом с учётом того, что в Haskell никто не использует static_if, есть основания полагать, что все use-case покрываются другими средствами. Причём тут вся статическая типизация — не ясно.
V>Я могу спросить в ответ привести пример, когда классы типов Хаскеля не являются костылем?
А они костыль.