Pull to refresh

Comments 15

Кроме типа-суммы и типа-произведения есть еще тип-объединение и тип-пересечение (я сам узнал из обсуждения к этой статье). Было бы интересно рассмотреть эти вопросы и здесь, причем в практическом аспекте.

Судя по статье по ссылке, Union Types - это и есть сумма типов, просто в TS нужно через typeof тип проверять, а не через pattern matching

Не стал я сильно усложнять.

Union vs sum types - тут можно посмотреть разницу на примере реализаций этих типов в Julia и Rust.

На примере Rust по идее не вышло бы про типы-объединения рассказать, так как в нём они не поддерживаются, потому что Rust компилируемый язык, а при компиляции всегда нужно знать, какой тип у переменной. То есть если в интерпретируемых языках я могу сделать проверку вида: typeof(var) == "int", то в компилируемых языках для этого придётся использовать теги, что собственно в типах-суммах и делается.

UFO landed and left these words here

В си такого нету. Есть typeof, но он работает только потому что компилятор знает тип переменной. Что-то вроде такого:

int var = 123;

typeof(var) y = 345;

Нормального примера использования typeof сходу не вспомнил.

UFO landed and left these words here

Я с крестами не особо знаком, но разве 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 аналигичный сишному в расте есть. Мне кажется, что этого достаточно чтобы продемонстрировать типы-объединения. Я бы даже сказал, что получение реального типа в рантайме из метаинформации — это читерство. Ведь по факту у нас тег есть, просто его хитро хранит рантайм.

UFO landed and left these words here
Sign up to leave a comment.

Articles