То, что вы хотите, не возможно - при вызове конструктора универсального объекта вызывающая сторона всегда может указать любой аргумент типа, который он хочет. Это похоже на вызов статического метода - вызывающая сторона всегда может указать тип:
let a = new Parent<Foo>()
let b = Parent<Foo>.Bar
Конструктор типа Parent<'T>
всегда возвращает значение типа Parent<'T>
, поэтому нельзя избежать использования типа 'T
в качестве части сигнатуры типа. Однако статический метод может иметь другой тип возвращаемого значения.
Возможно, вы могли бы использовать статический метод вместо конструктора?
type Child<'T>() = class end
type Parent<'T>(c:Child<'T>) =
static member New() = Parent(Child<unit>())
Тогда вы можете написать:
let a = Parent.New()
let b = Parent<Foo>.New() // You can specify type parameter, but it is ignored,
// because return type is always 'Parent<unit>'