我無法編譯下面的代碼:在非均勻實例化中的用法是什麼意思?
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和3消失了,但錯誤2仍然存在。順便說一句,如何以接口將呼叫轉移到class_的方式實現它? – Dystyria
啊,你是對的。我認爲問題在於'IAgent.CrossoverA'使用了一個沒有在類型上定義的類型arg。將類型arg添加到接口定義('type IAgent <'T>'),然後再次在實現點上運行。 – Daniel