类型匹配的问题(希望可以修复)F#

时间:2017-12-10 21:32:46

标签: f#

所以我有类型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这样的类型除了怪物之外的所有类型,但这也会导致问题。 我是大学二年级,任何帮助都将不胜感激

1 个答案:

答案 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 }