Просто для удовольствия я играл с эмуляцией типов в F #, используя представленные идеи here. Я создал класс следующего типа для представления значений, которые имеют «преемник», например. Следующий 1 = 2, рядом сегодня = завтра и т.д.:Сообщение об ошибке с ограничениями общего шифрования F #
type Next = Next with
static member (++) (Next, x:int) = x + 1
static member (++) (Next, x:DateTime) = x.AddDays 1.0
let inline next x = Next ++ x
let v1 = next 1 // v1 = 2
let v2 = next DateTime.Now // v2 = Now + 1 day
Теперь я хочу использовать "nextable" типы в обобщенном классе:
type UsesNextable<'T>(nextable: 'T) = // Compile error 1
member inline this.Next =
let v = next nextable // Compile error 2
v.ToString()
Но я получаю следующие ошибки:
- Подпись и реализация несовместимы, поскольку параметр типа в классе/сигнатуре имеет другое требование времени компиляции к элементу в члене/реализации
- Подпись и реализация несовместимы, потому что объявление параметра типа «T» требует ограничения формы (Next или^T): (static member (++): Next *^T -> ^? 155882)
Меня больше интересует то, что вторая ошибка пытается сказать. Что означает криптоват? 155882? Я предполагаю, что это может иметь какое-то отношение к тому, что вы не можете разрешить этот тип. Кроме того, при условии, что он пытается вывести ограничение быть:
(Next or ^T) : (static member (++) : Next * ^T -> ^T)
ли даже можно указать «или» состояние с помощью when 'T:...
? Я не могу понять действительный синтаксис.
Наконец,^T предлагает statically resolved type parameter, но в документации говорится, что они не могут использоваться для типов. Несмотря на это, я попытался изменить «T to^T», но все же получил те же ошибки.
Я понимаю, что этот пример злоупотребляет системой типов, поэтому я не предполагаю, что компилятор должен иметь возможность обрабатывать его. Однако, для моих собственных интересов, я хотел бы знать, что действительно означают сообщения об ошибках!
Это отличный ответ - спасибо! – Akash