2013-12-17 66 views
4

我無法編譯下面的代碼:在非均勻實例化中的用法是什麼意思?

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僅在此文件中使用。我感到困惑,項目中的其他課程都是用類似的打字模式創建的,並且運作良好。

回答

3

由於對接口實現的前向調用,它可能無法推斷返回類型CrossoverA。類型推斷只能使用當前點之前的類型信息。理想情況下,接口將呼叫轉移到類,而不是相反。這將解決推理問題。

編輯 - 另一個問題似乎是使用類型arg 'TIAgent.CrossoverA,這是沒有定義的類型。

+0

沒有。沒有轉發到接口錯誤1和3消失了,但錯誤2仍然存在。順便說一句,如何以接口將呼叫轉移到class_的方式實現它? – Dystyria

+2

啊,你是對的。我認爲問題在於'IAgent.CrossoverA'使用了一個沒有在類型上定義的類型arg。將類型arg添加到接口定義('type IAgent <'T>'),然後再次在實現點上運行。 – Daniel

相關問題