LINUX.ORG.RU

История изменений

Исправление 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
Без указания того что функция get с аргументом el t возвращает el, никакой вывод не работает, и следовательно невозможно описать следующую функцию:
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 Int дает Int, Float Float дает Float, а вот для Int + Float дает повышение до Float. А в Haskell можно написать такую функцию? monk, hateyoufeel?

Ну а возможности сделать 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
Без указания того что функция get с аргументом el t возвращает el, никакой вывод не работает, и следовательно невозможно описать следующую функцию:
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 Int дает Int, Float Float дает Float, а вот для Int + Float дает повышение до Float. А в Haskell можно написать такую функцию? monk, hateyoufeel?

Ну а возможности сделать 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
Без указания того что функция get с аргументом el t возвращает el, никакой вывод не работает, и следовательно невозможно описать следующую функцию:
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 Int дает Int, Float Float дает Float, а вот для Int + Float дает повышение до Float. А в Haskell можно написать такую функцию? monk, hateyoufeel?