LINUX.ORG.RU

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

Исправление Miguel, (текущая версия) :

Не увидел сложного способа.

Дженерик-тип зависит только от типов. Функторы дают возможность типам зависеть от переменных. Не от их значений, правда, а от их identity, но чтобы сделать такое без них, нужно сильно извратиться. Даже на Хаскеле.

module type T = sig val x : int end
module type SF = functor (A : T) -> sig type t val a : t end
module S : SF = functor (A : T) -> struct type t = int let a = 146 + A.x end
module T1 = struct let x = 0 end
module T2 = struct let x = 1 end
module T3 = struct let x = 0 end
module S1 = S(T1)
module S2 = S(T2)
module S3 = S(T3)
Типы S1.t, S2.t и S3.t все различны и между собой не совместимы. Выражения S1.a = S2.a даст ошибку компиляции, как и S1.a = S3.a. Дженерики тут не подойдут, они принимают только типы в качестве аргументов.

Исправление Miguel, :

Не увидел сложного способа.

Дженерик-тип зависит только от типов. Функторы дают возможность типам зависеть от переменных. Не от их значений, правда, а от их identity, но чтобы сделать такое без них, нужно сильно извратиться. Даже на Хаскеле.

module type T = sig val x : int end
module type SF = functor (A : T) -> sig type t val a : t end
module S : SF = functor (A : T) -> struct type t = int let a = 146 + A.a end
module T1 = struct let x = 0 end
module T2 = struct let x = 1 end
module T3 = struct let x = 0 end
module S1 = S(T1)
module S2 = S(T2)
module S3 = S(T3)
Типы S1.t, S2.t и S3.t все различны и между собой не совместимы. Выражения S1.a = S2.a даст ошибку компиляции, как и S1.a = S3.a. Дженерики тут не подойдут, они принимают только типы в качестве аргументов.

Исправление Miguel, :

Не увидел сложного способа.

Дженерик-тип зависит только от типов. Функторы дают возможность типам зависеть от переменных. Не от их значений, правда, а от их identity, но чтобы сделать такое без них, нужно сильно извратиться. Даже на Хаскеле.

module type T = sig val x : int end
module type SF = functor (A : T) -> sig type t val a : t end
module S : SF = functor (A : T) -> struct type t = int let a = 146 + T.a end
module T1 = struct let x = 0 end
module T2 = struct let x = 1 end
module T3 = struct let x = 0 end
module S1 = S(T1)
module S2 = S(T2)
module S3 = S(T3)
Типы S1.t, S2.t и S3.t все различны и между собой не совместимы. Выражения S1.a = S2.a даст ошибку компиляции, как и S1.a = S3.a. Дженерики тут не подойдут, они принимают только типы в качестве аргументов.

Исходная версия Miguel, :

Не увидел сложного способа.

Дженерик-тип зависит только от типов. Функторы дают возможность типам зависеть от переменных. Не от их значений, правда, а от их identity, но чтобы сделать такое без них, нужно сильно извратиться. Даже на Хаскеле.

module type T = sig val x : int end
module type SF = functor (A : T) -> sig type t val a : t end
module S : SF = functor (A : T) -> struct type t = int let a = 146 end
module T1 = struct let x = 0 end
module T2 = struct let x = 1 end
module T3 = struct let x = 0 end
module S1 = S(T1)
module S2 = S(T2)
module S3 = S(T3)
Типы S1.t, S2.t и S3.t все различны и между собой не совместимы. Выражения S1.a = S2.a даст ошибку компиляции, как и S1.a = S3.a. Дженерики тут не подойдут, они принимают только типы в качестве аргументов.