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 仅在此文件中使用。我感到困惑,项目中的其他类是用类似的打字模式创建的,而且效果很好。

4

1 回答 1

3

CrossoverA由于对接口实现的前向调用,它可能无法推断出返回类型。类型推断只能使用当前点之前可用的类型信息。理想情况下,接口会将调用转发给类,而不是相反。这将解决推理问题。

编辑 - 另一个问题似乎是使用类型 arg 'Tin IAgent.CrossoverA,它没有在类型上定义。

于 2013-12-17T16:53:50.767 回答