Что означает использование в неоднородном экземпляре?
Я не могу скомпилировать следующий код:
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
, который не определен по типу.