如何解决F#型引用错误?

如何解决F#型引用错误?,f#,mutual-recursion,F#,Mutual Recursion,我翻阅了我的书,在谷歌上搜索到搜索词用尽,但我仍然找不到这个问题的例子或答案: 以下代码未编译,因为在声明实体时尚未声明类型影响和类型影响。所以我不明白的是如何解决这个问题 在C++中,这个问题通过H文件中的原型声明来解决,然后包含H文件。在C#中,这从来都不是问题。那么在F#中它是如何解决的呢 #灯 类型实体= { 名称:字符串; 影响:列表;//编译错误:未定义影响类型 效果:列表;//编译错误:未定义类型效果 } 类型效应= { 名称:字符串; //获取实体并返回实体的方法的函数指针

我翻阅了我的书,在谷歌上搜索到搜索词用尽,但我仍然找不到这个问题的例子或答案:

以下代码未编译,因为在声明实体时尚未声明类型影响和类型影响。所以我不明白的是如何解决这个问题

在C++中,这个问题通过H文件中的原型声明来解决,然后包含H文件。在C#中,这从来都不是问题。那么在F#中它是如何解决的呢

#灯
类型实体=
{ 
名称:字符串;
影响:列表;//编译错误:未定义影响类型
效果:列表;//编译错误:未定义类型效果
}
类型效应=
{ 
名称:字符串;
//获取实体并返回实体的方法的函数指针
应用效果:实体->实体;
}
类型影响=
{ 
名称:字符串;
//此影响对象应用的效果列表
效应列表:列表;
//返回由列出的效果修改的实体的函数指针
应用效果:实体->实体;
}
这里的基本目标是Entity类型的对象应该能够列出它可以应用于Entity类型对象的影响。实体还可以列出已应用于它的效果。通过这种方式,实体的“当前”状态是通过折叠原始实体状态的所有效果来找到的

谢谢你抽出时间


--亚当·伦达我相信这是正确的答案:

所以

类型实体=
{ 
名称:字符串;
影响:列表;
效果:列表;
}
和效果=
{ 
名称:字符串;
应用效果:实体->实体;
}
和影响=
{ 
名称:字符串;
效应列表:列表;
应用效果:实体->实体;
}

是的-这正是我要发布的内容,现在我找到了。“面向现实世界的函数式编程”第8章:“‘专家f#’Hrmm”第67页第3章。。。我正要发布同样的东西,但在得到一个编译器错误后,我断定这是不可能的!结果我只是语法有点错误。另请参阅,其中显示了如何定义相互递归函数以及相互递归类型。
#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;
    }
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;
    }