Comments 15
Опечатка? мощностью 2*256=512 ?
Кроме типа-суммы и типа-произведения есть еще тип-объединение и тип-пересечение (я сам узнал из обсуждения к этой статье). Было бы интересно рассмотреть эти вопросы и здесь, причем в практическом аспекте.
Судя по статье по ссылке, Union Types - это и есть сумма типов, просто в TS нужно через typeof тип проверять, а не через pattern matching
Не стал я сильно усложнять.
Union vs sum types - тут можно посмотреть разницу на примере реализаций этих типов в Julia и Rust.
На примере Rust по идее не вышло бы про типы-объединения рассказать, так как в нём они не поддерживаются, потому что Rust компилируемый язык, а при компиляции всегда нужно знать, какой тип у переменной. То есть если в интерпретируемых языках я могу сделать проверку вида: typeof(var) == "int"
, то в компилируемых языках для этого придётся использовать теги, что собственно в типах-суммах и делается.
В си такого нету. Есть typeof, но он работает только потому что компилятор знает тип переменной. Что-то вроде такого:
int var = 123;
typeof(var) y = 345;
Нормального примера использования typeof сходу не вспомнил.
Я с крестами не особо знаком, но разве typeid не во время компиляции вычисляется?
UPD:
Если брать union в c++, то там нет возможности определить какой член является установленным, насколько я знаю:
union MyUnion {
int x;
double y;
}
void myfunc(MyUnion u) {
// Можно ли понять без тега, какой член в u был
// установлен?
}
В расте разве отсутствует сишный typeid().name() для проверки типа?! O_O
Есть и std::any::type_name
и TypeId::of()
, но и в расте и в С++ это никак не поможет для определения, что именно сейчас находится внутри union
— в рантайме этой информации нет.
На примере Rust по идее не вышло бы про типы-объединения рассказать, так как в нём они не поддерживаются, потому что Rust компилируемый язык, а при компиляции всегда нужно знать, какой тип у переменной
На всякий случай, уточню, что union
аналигичный сишному в расте есть. Мне кажется, что этого достаточно чтобы продемонстрировать типы-объединения. Я бы даже сказал, что получение реального типа в рантайме из метаинформации — это читерство. Ведь по факту у нас тег есть, просто его хитро хранит рантайм.
Алгебраические Типы Данных