所以我有类型Gitem
type Gitem =
|Weapon of Weapon
|Bomb of Bomb
|Monster of Monster
|Armour of Armour
|Potion of Potion
|None
这用于在记录中存储不同类型的对象,要清楚,我遇到问题的类型如下:
type Monster={
name:string;
dVal:float;
dType:DamType;
hVal:float;
info:string;
dInfo:string;
dCry:string;
Special:bool;
sItem:obj;
}
type Armour={
name:string;
aVal:float;
dType:DamType;
info:string;
iSpace:int;
hidden:bool;
}
type Weapon={
name:string;
dVal:float;
dType:DamType;
info:string;
iSpace:int;
hidden:bool;
}
问题是,Gitem将Monster作为一种潜在类型,但是怪物可以拥有炸弹,武器或盔甲作为他们的系统,因此我制造了类型物体。 后来在我的代码中写道:
match monster.sItem with //gives them the item if the monster drops one
| Bomb bomb ->
procBomb bomb
| Weapon weap ->
procWeap weap
| Potion pot ->
procPot pot
| Armour arm ->
procArm arm
我得到的错误表达式应该是Gitem,而不是obj,但是我不能将怪物sitem字段设为Gitem,因为Gitem使用怪物作为可能类型而不允许。我尝试制作另一种像Gitem这样的类型除了怪物之外的所有类型,但这也会导致问题。 我是大学二年级,任何帮助都将不胜感激
答案 0 :(得分:5)
可以使用and
关键字声明相互递归类型:
type A = { b : B }
and B = { a : A option }
此外,F#4.1引入了recursive modules(和名称空间),它允许模块(名称空间)级别的相互递归类型。如果您有许多冗长的相互依赖类型(注意没有and
),这很有用:
module rec RecursiveModule =
type A = { b : B }
type B = { a : A option }