Types 无法返回需要强制转换的类型(F#)

Types 无法返回需要强制转换的类型(F#),types,casting,f#,Types,Casting,F#,我无法将一个类型的特定案例返回到另一个只想保存泛型案例的类型,而不是实际实现特定示例。(例如,与下面的类型无关,我尝试返回厘米,而不是以厘米为单位返回0.1) 我的类型定义如下: type UnitOfMeasure = | Foo of decimal | Bar of decimal | Baz of decimal 我还有: type BlahComponent = { Name : string Units : UnitOfMeasure

我无法将一个类型的特定案例返回到另一个只想保存泛型案例的类型,而不是实际实现特定示例。(例如,与下面的类型无关,我尝试返回厘米,而不是以厘米为单位返回0.1)

我的类型定义如下:

 type UnitOfMeasure =
    | Foo of decimal
    | Bar of decimal
    | Baz of decimal
我还有:

 type BlahComponent =
    { Name : string
      Units : UnitOfMeasure }
我得到了一个度量单位类型的字符串表示,我正试图确定我有哪种度量单位(Foo、Bar或Baz)。我正在使用以下功能:

let decideUnitOfMeasure stringRepresentationOfUnitOfMeasureType = 
    match stringRepresentationOfUnitOfMeasureType with 
      | "Foo" -> Foo
      | "Bar" -> Bar 
      | "Baz" -> Baz
最后,我尝试将decideUnitOfMeasure的返回值分配给BlahComponent

        let stringRepresentationOfUnitOfMeasureType = "Foo"
        let bomComponent = {Name = "nameString"
                            Units = decideUnitOfMeasure stringRepresentationOfUnitOfMeasureType}
尝试将decideUnitOfMeasure返回值分配给单位会导致以下错误: 表达式应具有类型“UnitOfMeasure”,但具有类型“(decimal->UnitOfMeasure)”


根据度量单位的定义,返回Foo、Bar或Baz的实际大小写似乎是不可能的,因为它需要将度量单位转换为十进制。有没有办法返回实际案例而不转换为小数点

重新定义
UnitOfMeasure
,使其更像一个简单的枚举,其中构造函数没有参数,这对您可能是最好的:

type UnitOfMeasure =
    | Foo
    | Bar
    | Baz
现在可以移动十进制值,使其不是类型参数。您可以创建记录类型,甚至将其作为简单元组保存:

type BlahComponent =
    { Name : string
      Value : UnitOfMeasure * decimal }

通过重新定义
UnitOfMeasure
使其更像一个简单的枚举,构造函数没有参数,您可能会得到最好的服务:

type UnitOfMeasure =
    | Foo
    | Bar
    | Baz
现在可以移动十进制值,使其不是类型参数。您可以创建记录类型,甚至将其作为简单元组保存:

type BlahComponent =
    { Name : string
      Value : UnitOfMeasure * decimal }

这不是关于铸造。这只是一个类型错误

Foo
UnitOfMeasure
类型的构造函数。它的类型为
decimal->UnitOfMeasure
。这意味着它接受一个
十进制
值并返回一个
度量单位

所以,
Foo
本身并不是一个度量单位,但
foo1m
是。您的
Units
字段实际上也存储了数字,但您没有提供数字


这就解释了为什么您会看到这个错误。Chad Gilbert的回答提供了一种可能的替代方法,但最好的方法实际上取决于你正在尝试做什么。

这不是关于铸造。这只是一个类型错误

Foo
UnitOfMeasure
类型的构造函数。它的类型为
decimal->UnitOfMeasure
。这意味着它接受一个
十进制
值并返回一个
度量单位

所以,
Foo
本身并不是一个度量单位,但
foo1m
是。您的
Units
字段实际上也存储了数字,但您没有提供数字

这就解释了为什么您会看到这个错误。Chad Gilbert的答案提供了一种可能的替代方法,但最好的方法实际上取决于您试图做什么