启动与单个构造函数不同数据类型的歧视结合



说我有一种类型:

type Variedvalue = I of int| S of string | F of float

是否有一种方法可以创建一个函数,该函数涉及一个通用参数,该参数初始化了联合的正确字段?

即之类的东西

with static member initVariedValue (x : 'a) = 
   match x.getType() with  
   | int -> VariedValue.I x 
   | float -> VariedValue.F x
   | String -> VariedVAlue.S x

这不起作用,即使我在这种情况下将通用变量被推断为INT,因此它也永远不会到达浮点或字符串条件。因此,是否有一些聪明的方法可以做到这一点,或者我只需要为每个字段创建一个构造函数?

是的,您可以执行此操作。但是,当将意外类型传递到构造函数函数中时,您将需要支持这种情况。我会通过返回Result<VariedValue, 'e>而不是直接返回VariedValue来做到这一点。另外,您可能会犯下未指导的案例,但这在我看来会打破构造函数的预期行为。

type VariedValue = I of int| S of string | F of float
module VariedValue =
    let init (x: 'a) =
        match box x with
        | :? int as i -> I i |> Ok
        | :? string as s -> S s |> Ok
        | :? float as f -> F f |> Ok
        | _ -> Error <| sprintf "Unsupported VariedValue Type: %s" (x.GetType().Name)

示例:

> VariedValue.init 3;;
[<Struct>]
val it : Result<VariedValue,string> = Ok (I 3)
> VariedValue.init <| System.Guid.NewGuid();;
[<Struct>]
val it : Result<VariedValue,string> =
  Error "Unsupported VariedValue Type: Guid"

相关内容

  • 没有找到相关文章

最新更新