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 このバインディングの明示的なクラスまたは関数型変数の 1 つ以上を一般化できませんでした。他の型に制約されていたためです

また、並んでいmailbox.Post(CrossoverMessage genomeIn)ます:

エラー 3 型 ''T' は型 ''a' と一致しません

プロジェクトのどこにも変数「a」を使用していません。また、CrossoverA という名前は、このファイルでのみ使用されます。プロジェクトの他のクラスは同様のタイピング パターンで作成され、うまく機能します。

4

1 に答える 1

3

CrossoverAインターフェイス実装への転送呼び出しのため、戻り値の型を推測できない可能性があります。型推論は、現在のポイントより前に利用可能な型情報のみを使用できます。理想的には、インターフェイスはクラスへの呼び出しを転送し、その逆ではありません。これにより、推論の問題が修正されます。

EDIT - 別の問題は、タイプで定義されていないタイプ arg 'Tinの使用のようです。IAgent.CrossoverA

于 2013-12-17T16:53:50.767 に答える