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#,我有以下带有成员函数的区分并集,其中我要返回未装箱类型: type ModelData = | Double of double | UInt32 of uint32 | UInt16 of uint16 | Byte of byte | Int32 of int32 | String of string | Bit of Bit member inline this.Value : 'a = match this

我有以下带有成员函数的区分并集,其中我要返回未装箱类型:

type ModelData =
    | Double of double
    | UInt32 of uint32
    | UInt16 of uint16
    | Byte of byte
    | Int32 of int32
    | String of string
    | Bit of Bit
    member inline this.Value : 'a =
        match this with
        | Double x -> x
        | UInt32 x -> x
        | UInt16 x -> x
        | Byte x -> x
        | Int32 x -> x
        | String x -> x
        | Bit x -> x
错误在于成员“this.Value”没有为每个分支返回相同的类型。这可能吗

编辑#1

我有一个定义如下的数据库,它使用这种
ModelData
类型:

module Database =
    type Drecord =
        { Value: ModelData}
    type Db = Dictionary<string, Drecord>
这目前不起作用,因为sprintf需要一个
float
,而不是
ModelData
。因此,我认为我可以调用一个函数来安全地转换为该类型(因此,
this.Value
成员)。通过使用
this.Value
而不是返回一个字符串,并且在我的sprintf格式字符串中只使用
%s
,我可以实现这一点。 所以这是可行的:

sprintf "{\"General\":{\"Example\":%s}}" value.Value

有没有更好的办法解决这个问题?

我不知道我是否明白你想做什么。如果您定义了一个有区别的并集,那么该值可以是任意一种情况,并且当您想要使用
ModelData
类型的值时,您需要对其进行模式匹配,以确定您拥有的值的类型

如果您添加了一种获取仅适用于一种特定情况的值的方法(例如,当该值为
浮点值时
),则您将失去受歧视的联合所提供的所有安全性。所以,我认为按照你的要求去做很可能是个坏主意

也就是说,您可以定义一个成员
GetValue():'a=
与此匹配
|双x->取消x

|UInt16 x->unbox我不确定我是否明白你想做什么。如果您定义了一个有区别的并集,那么该值可以是任意一种情况,并且当您想要使用
ModelData
类型的值时,您需要对其进行模式匹配,以确定您拥有的值的类型

如果您添加了一种获取仅适用于一种特定情况的值的方法(例如,当该值为
浮点值时
),则您将失去受歧视的联合所提供的所有安全性。所以,我认为按照你的要求去做很可能是个坏主意

也就是说,您可以定义一个成员
GetValue():'a=
与此匹配
|双x->取消x
|UInt16 x->取消这是。你试图做一些没有意义的事情,可能是为了解决一个有意义的问题。我们很可能会帮你解决这个问题,但你必须先告诉我们它是什么。这是一个问题。你试图做一些没有意义的事情,可能是为了解决一个有意义的问题。我们很可能会帮你解决这个问题,但你必须先告诉我们它是什么。
sprintf "{\"General\":{\"Example\":%s}}" value.Value
type ModelData =
    | Double of double
    | UInt32 of uint32
    | UInt16 of uint16
    member inline this.GetValue<'a>() : 'a =
        match this with
        | Double x -> unbox<'a> x
        | UInt32 x -> unbox<'a> x
        | UInt16 x -> unbox<'a> x

let v = Double 1.23
v.GetValue<float>()