说我有一种类型:
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"