История изменений
Исправление
MOPKOBKA,
(текущая версия)
:
Нет. Это не так работает и это в принципе ещё одна проблема.
Потому и добавил «Если верить», если не верить, то для Standard ML есть документ, но это уже 1984 год. 80е это уже не совсем древность, но между Rust 1.0 и Standard ML разница 31 год.
Свойство там одно - есть A и B и они преобразуются в C каким угодно образом.
Я подумал что GADT это может выразить, но нет, если взять типичное его использование, то нужно в описании типа самому построить схему преобразование типов.
type 'a t =
| Array : 'a array -> 'a t
| Bytes : bytes -> 'a t
(* Нельзя написать без указания типа вручную *)
let get (type el) (t:el t) i : el =
match t with
| Array a -> Array.get a i
| Bytes s -> Bytes.get s i
type 'a number_t =
| Int : int -> int number_t
| Float : float -> float number_t
let add (type tx ty) (x : tx number_t) (y : ty number_t) : 'c =
match (x, y) with
| (Int x, Int y) -> Int (x + y)
| (Float x, Float y) -> Float (x +. y)
| (Int x, Float y) | (Float y, Int x) -> Float ((float_of_int x) +. y)


Ну а возможности сделать int_t нету, так как нету возможности добавить скаляр в тип, даже массивы не имеют размера представленного числом. Так что это самое близкое что я придумал, к вычислению типа в теле.
Исправление
MOPKOBKA,
:
Нет. Это не так работает и это в принципе ещё одна проблема.
Потому и добавил «Если верить», если не верить, то для Standard ML есть документ, но это уже 1984 год. 80е это уже не совсем древность, но между Rust 1.0 и Standard ML разница 31 год.
Свойство там одно - есть A и B и они преобразуются в C каким угодно образом.
Я подумал что GADT это может выразить, но нет, если взять типичное его использование, то нужно в описании типа самому построить схему преобразование типов.
type 'a t =
| Array : 'a array -> 'a t
| Bytes : bytes -> 'a t
(* Нельзя написать без указания типа вручную *)
let get (type el) (t:el t) i : el =
match t with
| Array a -> Array.get a i
| Bytes s -> Bytes.get s i
type 'a number_t =
| Int : int -> int number_t
| Float : float -> float number_t
let add (type tx ty) (x : tx number_t) (y : ty number_t) : 'c =
match (x, y) with
| (Int x, Int y) -> Int (x + y)
| (Float x, Float y) -> Float (x +. y)
| (Int x, Float y) | (Float y, Int x) -> Float ((float_of_int x) +. y)


Ну а возможности сделать int_t нету, так как нету возможности добавить скаляр в тип, даже массивы не имеют размера представленного числом.
Исходная версия
MOPKOBKA,
:
Нет. Это не так работает и это в принципе ещё одна проблема.
Потому и добавил «Если верить», если не верить, то для Standard ML есть документ, но это уже 1984 год. 80е это уже не совсем древность, но между Rust 1.0 и Standard ML разница 31 год.
Свойство там одно - есть A и B и они преобразуются в C каким угодно образом.
Я подумал что GADT это может выразить, но нет, если взять типичное его использование, то нужно в описании типа самому построить схему преобразование типов.
type 'a t =
| Array : 'a array -> 'a t
| Bytes : bytes -> 'a t
(* Нельзя написать без указания типа вручную *)
let get (type el) (t:el t) i : el =
match t with
| Array a -> Array.get a i
| Bytes s -> Bytes.get s i
type 'a number_t =
| Int : int -> int number_t
| Float : float -> float number_t
let add (type tx ty) (x : tx number_t) (y : ty number_t) : 'c =
match (x, y) with
| (Int x, Int y) -> Int (x + y)
| (Float x, Float y) -> Float (x +. y)
| (Int x, Float y) | (Float y, Int x) -> Float ((float_of_int x) +. y)

