Types 创建具有3种不同基元类型的判别联合类型的列表

Types 创建具有3种不同基元类型的判别联合类型的列表,types,syntax,f#,discriminated-union,Types,Syntax,F#,Discriminated Union,因此,我试图创建一个歧视联合类型的列表,例如 type ColType = Int of int | Float of float | String of string 然后插入到列表中,例如 let addToList (list : ColType list) (col : ColType) = let list' = list @[col] list' 但是我不确定如何初始化coltype值,因为我只得到int->coltype等值 我试过这个函数 let createColType

因此,我试图创建一个歧视联合类型的列表,例如

type ColType = Int of int | Float of float | String of string 
然后插入到列表中,例如

let addToList (list : ColType list) (col : ColType) =
let list' = list @[col]
list'
但是我不确定如何初始化coltype值,因为我只得到int->coltype等值

我试过这个函数

let createColType x = 
    if x.GetType() = int then  
        Int x
    else if x.GetType() = float then 
        Float x 
    else if x.GetType() = string then  
        String x
    else 
        String x

这显然不起作用,因为它将返回不同的值,那么您将如何解决这个问题呢?

使用
match
检查多个选项,使用
:?
匹配类型:

let createColType x = 
    match box x with
    | :? int    as i -> ColType.I i
    | :? float  as f -> ColType.F f
    | :? string as s -> ColType.S s
    |_-> failwithf "Type not supported %A" <| x.GetType().FullName

createColType  1  |> printfn "%A" // shows:  I 1
createColType  2. |> printfn "%A" // shows:  F 2.0
createColType "3" |> printfn "%A" // shows:  S "3"
让createColType x=
将方框x与
| :? int as i->ColType.i
| :? 浮动为f->ColType.f
| :? 字符串为s->ColType.s
|_->failwithf“类型不支持%A”打印fn“%A”//显示:I 1
createColType 2.|>printfn“%A”//显示:f2.0
createColType“3”|>printfn“%A”//shows:S“3”

通过使用
选项
作为我的
tryCreate
的返回类型,我不会得到任何运行时异常。您还会注意到,我曾尝试创建与我的业务目标相关联的DU标签。这使得表达意图更容易,并且使联合比简单的int、string和float更有用。大多数时候,我知道自己的类型,因为该类型对应于业务用途,所以我不必编写或使用tryCreate。通常在实践中,将原语映射到我们的歧视工会是没有意义的,例如,如果我们添加了<代码>热狗的INT/代码>如果我们添加的是热狗或汉堡包,那么它是含糊不清的。< /P>你如何使用CureCeCyType函数?您是将其用于类型化值还是obj类型的值?int、float和string代表什么?你为什么不允许十进制呢?如果这些代表业务约束,您可能需要考虑将这些真实名称与业务需求对齐。这里使用的类型测试模式匹配是正确的方法。但我通常更喜欢使用
Ok
Error
返回结果类型,而不是抛出异常。然后,任何调用此函数的代码都可以决定一个不受支持的类型是否值得为其引发异常并可能破坏应用程序。我高度怀疑它们的实际类型是String、Int、Float。此外,DU从一开始就可以防止出现任何故障。
type Food = Hamburgers of int | Soda of float | Other of string 
module Food = 
    let tryCreate food = 
        match box food with
        | :? int as i -> Some(Hamburgers i)
        | :? float as f -> Some(Soda f)
        | :? string as s -> Some(Other s)
        | _ -> None

let burgers = Hamburgers 7
let soda = Soda 3.2
let mozzarellaSticks = Other "Mozzarella Sticks"
let mysteryMeat = Option.toList(Food.tryCreate "nobody knows")

let list = [burgers; soda; mozzarellaSticks] @ mysteryMeat