6

私は自分の本を読み、検索語がなくなるまでグーグルで検索しましたが、それでもこの問題の例や答えを見つけることができません。

次のコードは、エンティティが宣言された時点でタイプEffectとタイプAffectが宣言されていないため、コンパイルされません。だから私が理解していないのは、これを回避する方法です。

C ++では、この問題はhファイルでのプロトタイプ宣言とhファイルのインクルードによって解決されます。C#では、これが問題になることはありません。では、F#でどのように解決されますか?

#light
type Entity = 
    { 
        Name:string; 
        Affects:List<Affect>; //Compile error: The type Affect is not defined
        Effects:List<Effect>; //Compile error: the type Effect is not defined
    }

type Effect = 
    { 
        Name:string; 
        //A function pointer for a method that takes an Entity and returns an Entity
        ApplyEffect:Entity -> Entity;
    }

type Affect = 
    { 
        Name:string; 
        //A List of Effects that are applied by this Affect Object
        EffectList:List<Effect>; 
        //A function pointer to return an Entity modified by the listed Effects
        ApplyAffect:Entity->Entity;
    }

ここでの基本的な目標は、タイプEntityのオブジェクトが、タイプEntityのオブジェクトに適用できる影響を一覧表示できるようにすることです。エンティティは、適用されたエフェクトを一覧表示することもできます。このように、エンティティの「現在の」状態は、すべてのエフェクトを元のエンティティの状態に対して折りたたむことによって検出されます。

お時間をいただきありがとうございます、

-アダム・レンダ

4

1 に答える 1

13

これが正しい答えだと思います:

http://langexplr.blogspot.com/2008/02/defining-mutually-recursive-classes-in.html

それで...

type Entity = 
    { 
        Name:string; 
        Affects:List<Affect>; 
        Effects:List<Effect>; 
    }
and Effect = 
    { 
        Name:string; 
        ApplyEffect:Entity -> Entity;
    }
and  Affect = 
    { 
        Name:string; 
        EffectList:List<Effect>; 
        ApplyAffect:Entity->Entity;
    }
于 2009-05-11T15:30:01.657 に答える