2013-12-17 41 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

相关问题