Универсальный тип F # с неуниверсальным конструктором - PullRequest
1 голос
/ 24 апреля 2011

Есть ли какой-нибудь способ иметь универсальный тип с конструктором без параметров, который создает неуниверсальный экземпляр?Пример без компиляции:

type Child<'T>() = class end

type Parent<'T>(c:Child<'T>) =
   new() = Parent(Child<unit>()) // ERROR: This code is less generic than required by 
                                 // its annotations because the explicit type variable
                                 // 'T' could not be generalized. It was constrained to be 'unit'.

Я хочу неуниверсальное значение, чтобы избежать ограничения значения, а также потому, что я хочу использовать 'T с перегрузкой (например, перегрузка на Parent<int> против Parent<bool> и т. Д.).

Я думаю, что это, вероятно, невозможно, и мне нужно найти другой способ для моделирования вещей.Но, может быть, у кого-то есть идея?

Ответы [ 2 ]

3 голосов
/ 24 апреля 2011

То, что вы хотите, не возможно - при вызове конструктора универсального объекта вызывающая сторона всегда может указать любой аргумент типа, который он хочет. Это похоже на вызов статического метода - вызывающая сторона всегда может указать тип:

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>'
1 голос
/ 24 апреля 2011

Честно говоря, я думаю, что вы действительно ищете необязательный параметр.

type Parent<'T>(?c:Child<'T>) = class 

    end

Конечно, это требует, чтобы они указали тип, но разве это плохо?

let p = Parent<int>()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...