Что означает использование в неоднородном экземпляре?

Я не могу скомпилировать следующий код:

open Genotype
open Genome

type IAgent =
    abstract member CrossoverA: Genome<'T> -> unit

type internal AgentMessage<'T> = 
  | GetEnergy of AsyncReplyChannel<int>
  | CrossoverMessage of Genome<'T>
  | CompareMessage of Genome<'T>

type Agent<'T>(initialLifeEnergy : int, genotype : IGenotype<'T>) =
    let LifeEnergy = initialLifeEnergy
    let mailbox = new MailboxProcessor<AgentMessage<'T>>(fun inbox ->
        let rec loop  =
            async {  
                    let! (msg) = inbox.Receive()
                    printfn "Message received: %O" msg
                    match msg with 
                        | GetEnergy reply -> 
                              reply.Reply(LifeEnergy)
                        | CrossoverMessage genome->
                            printfn "crossover"
                        | CompareMessage fenome ->
                            printfn "compare" 
                        }
        loop )
    do
        mailbox.Start()


    member this.CrossoverA(genomeIn: Genome<'T>)  = (this :> IAgent).CrossoverA(genomeIn: Genome<'T>) 
    interface IAgent with
        member this.CrossoverA(genomeIn: Genome<'T>)  = 
            printfn "Crossover"
            mailbox.Post(CrossoverMessage genomeIn)

Есть ошибка в строке member this.CrossoverA(genomeIn: Genome<'T>):

Ошибка 1 Универсальный элемент 'CrossoverA' использовался в неоднородном экземпляре до этой программной точки. Подумайте о переупорядочении членов, чтобы этот элемент появился первым. В качестве альтернативы можно явно указать полный тип элемента, включая типы аргументов, тип возвращаемого значения и любые дополнительные общие параметры и ограничения.

Ошибка 2 Не удалось обобщить одну или несколько явных переменных класса или типа функции для этой привязки, поскольку они были ограничены другими типами.

а также в соответствии mailbox.Post(CrossoverMessage genomeIn):

Ошибка 3 Тип '' T 'не соответствует типу' 'a'

Я не использую переменную '' a 'в любом месте проекта. Также имя CrossoverA используется только в этом файле. Я чувствую себя озадаченным, другие классы в проекте были созданы с подобными шаблонами набора текста и работают хорошо.

1 ответ

Решение

Это, вероятно, не может вывести тип возврата CrossoverA из-за прямого вызова к реализации вашего интерфейса. Вывод типа может использовать только информацию о типе, доступную до текущей точки. В идеале интерфейс должен переадресовывать вызовы в класс, а не наоборот. Это решило бы проблему вывода.

РЕДАКТИРОВАТЬ - Другая проблема, кажется, использование типа arg 'T в IAgent.CrossoverA, который не определен по типу.

Другие вопросы по тегам