| |||
|
|
Еще об умножение В эпическом треде наиболее замечательно то, что как отметил 38-pop@lj, народ много рассуждая о размерностях (и за и против) в массе не видит, что как раз в этом плане там формальная ошибка (причем я не уверен, что в методичке ошибка - потому как от размерностей у второклашки мозги точно в трубочку свернутся, а рассказать упрощенный, но ошибочный вариант - стандартная практика - например так теорию множеств в институте обычно рассказывают). Вообще - типы "на интуиции" (а размерности - частный случай типовой системы) - стандартный источник лажания, даже там где все совсем просто. Причина видимо в том, что у людей не сформирован соответствующий понятийный аппарат, ну и в том, что систем типов есть довольно много и плохо совместимых, а в голове у народа лежат обрывки из них всех вперемежку. Вот по поводу типизации throw мне там чего только не писали (_qwerty@lj не в счет - он просто знает ответ). Аж про "тип goto" пытались уесть (хотя в А-68 именно что goto - тоже выражение). Вопрос о типизации throw на сам деле не пустой: потому как грязные хаки с приведениями из А-68 и С++ работают только ad hoc: например вопрос о типизации функций без результата на сам деле не пустой - а их много - failure например еще, да вообще - noreturn не даром везде в С++ естьб хоть и не входит в стандарт. Попытки в качестве оного пристроить void тоже умилительны. Вот это как раз то решение котороне не может работать. Работающих решения я знаю два: первое обычно для систем типов с отношением "подтип" (к коим относится С++): там типы легко можно дополнить до решетки (просто введя операции "и" и "или")*, и соответственно void оказывается минимальным типом, а максимальный элемент - как раз и есть тип для функций, не возвращающих значений. Но обычно у людей в голове сидит стереотип, что void - это и то и то и начинается хождение кругами (потому как не вытанцовывается - склеить минимум с максимумом довольно сложно). Второй вариант на С++ почти пишется: template <class T1, class T2> T1 throw (T2 exn); Именно то, что надо - единственная проблема, что в С++ темплейты не являются типами, ну и в том, что компилятор сам не выведет тип - придется явно указывать - (b ? 1 : throw<int, Error> (e)) Но это преодолимо. А в функциональщине это просто стандартная вещь: типы функций "без результата" - именно как правило ∀ a.a Вообще гря если тип функции оказался независимым от типов ее параметров - это значит, что она никогда не возвращает значения "нормальным образом" (либо зацикливается либо выходит нештатно). Это просто полезная диагностика, причем вполне автоматическая. Но вокруг этого кругами ходили очень долго. *) Можно и не вводить - в принципе постулировать существование bot и top достаточно. Хотя на сам деле удобнее ввести - иначе например с типизацией того же условного выражения будут проблемы - естественный его тип "и" типов веток. |
||||||||||||||