Типи та algebraic data types
Sum types, enum-и й payload variants — одна модель. Без nullable magic і без неявного перетворення між enum-ами.
Axiom використовує nominal identity типів, але surface syntax не змушує вас постійно писати довгі qualified names. Compiler використовує контекст там, де він однозначний.
Enum — це sum type без payload
1color:2 | red3 | green4 | blue5END color67paint(color c):8 if c == red:9 // red однозначно означає color.red10 RETURNПочинаємо іменований ADT.
Варіант без payload.
Тип закривається як будь-який structural block.
Параметр задає expected type.
Тому red можна писати без color::red.
Result без exceptions
1load_port(text path) -> result<u16, io_error>:2 const text raw = fs.read_text(path)?3 const u16 port = text.parse_u16(raw)?4 RETURN ok(port)Return type прямо каже: або u16, або io_error.
? — target surface для раннього повернення error variant; він не кидає exception.
Парсинг теж може повернути error.
Успішний variant виводиться з expected return type.
Pattern matching
1describe(result<u16, io_error> value) -> text:2 match value:3 ok(port):4 RETURN text.format("port={}", port)5 error(permission_denied):6 RETURN "permission denied"7 error(_):8 RETURN "I/O error"Тип scrutinee задає контекст усім variant names.
Дістаємо payload успішного результату.
Можна матчити вкладений error kind.
Fallback на решту I/O errors. Compiler перевіряє exhaustiveness.
Generic type
1-- T2pair:3 T first4 T second5END pair-- T оголошує type parameter для наступного declaration.
Звичайний structural type.
Поле типу T.
Закриття типу.