I can not compile the following code:
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)
There member this.CrossoverA(genomeIn: Genome<'T>)is an error in the line :
Mistake 1 The common "CrossoverA" member was used for uneven instantiation to this software point. Consider reordering members so that this member appears first. Alternatively, specify the full element type explicitly, including argument types, return type, and any additional general parameters and restrictions.
Error 2 One or more explicit variables of a class or function type for this binding cannot be generalized because they were limited by other types
as well as in the line mailbox.Post(CrossoverMessage genomeIn):
Error 3 Type '' T 'does not match type' 'a'
'' a ' . , CrossoverA . , .