Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 根据输入F的类型比较类型和过程功能#_F# - Fatal编程技术网

F# 根据输入F的类型比较类型和过程功能#

F# 根据输入F的类型比较类型和过程功能#,f#,F#,我有一个房间列表,每个房间都包含一个武器、炸弹或怪物的对象,有没有办法检查包含的是哪种类型,然后根据这一点调用不同的功能?下面是以前的尝试 let ritemprocess (a:Room) = match a.item.GetType with | Bomb -> procBomb(a.item) 这里我看的是一个房间的项目,如果它是一个bomb,我调用processbomb函数,它需要输入类型bomb来工作,但是我得到的错误是a.item是object类型而不是bo

我有一个房间列表,每个房间都包含一个武器、炸弹或怪物的对象,有没有办法检查包含的是哪种类型,然后根据这一点调用不同的功能?下面是以前的尝试

let ritemprocess (a:Room) = 
    match a.item.GetType with
    | Bomb -> procBomb(a.item)
这里我看的是一个房间的项目,如果它是一个bomb,我调用processbomb函数,它需要输入类型bomb来工作,但是我得到的错误是a.item是object类型而不是bomb类型

房间类型如下:

    type Room = {
    id:int;
    item:obj;
    n:int;
    e:int;
    s:int;
    w:int;
    complete:bool;
}
F#是静态类型的;当您的房间类型显示物品属于
obj
类型时,恰恰是因为,您不能在需要非
obj
的环境中使用它。有一种方法可以通过运行时类型转换来避免这种情况:

let ritemprocess (a:Room) = 
    match a.item with
    | :? Bomb as bomb -> procBomb bomb
    ...
但通常,当它作为域模型的一部分发生时,它会被认为是一种代码气味

一种典型的方法是使用一个有区别的联合来模拟您的项目类型:

type Item =
    | Weapon of Weapon
    | Bomb of Bomb
    | Monster of Monster

type Room = {
    id:int;
    item:Item;
    n:int;
    e:int;
    s:int;
    w:int;
    complete:bool;
}
假设
武器/炸弹/怪物
是代码中已经存在的类型。然后您只需匹配项目类型案例:

let ritemprocess (a:Room) = 
    match a.item with
    | Bomb bomb -> procBomb bomb
    ...