首页 > 解决方案 > 创建具有 3 种不同原始类型的可区分联合类型列表

问题描述

所以我试图创建一个有区别的联合类型的列表,例如;

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

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

标签: typessyntaxf#discriminated-union

解决方案


用于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"

推荐阅读