F#将自定义类型转换/转换为原始

时间:2015-06-02 17:17:41

标签: types casting f# primitive

我已经使用自定义F#类型设计了我的应用域,但现在看来这些自定义类型将是PITA,当我想将数据实际用于各种任务时...即将值写入CSV文件,使用依赖原语等的其他库

例如,我有一个这样的自定义类型(用作其他较大类型的构建块):

type CT32 = CT32 of float

但像这样的代码不起作用:

let x = CT32(1.2)
let y = float x //error: The type "CT32" does not support a conversion...
let z = x.ToString() //writes out the namespace, not the value (1.2)

我尝试使用box / unbox和Convert.ToString()以及两个F#强制转换运算符,但它们似乎都不允许我访问我的类型包含的基本原语值。是否有一种简单的方法可以获得自定义类型中的原始值,因为到目前为止它们更令人头疼,而不是实际有用。

3 个答案:

答案 0 :(得分:4)

添加对float的支持很简单:

type CT32 = CT32 of float with
    static member op_Explicit x =
        match x with CT32 f -> f

let x = CT32(1.2)
let y = float x

答案 1 :(得分:1)

您的type CT32是一个带有一个案例标识CT32 of float的歧视联盟。它不是alias浮动类型,因此您无法将其转换为浮动类型。 要从中提取值,您可以使用模式匹配(这是最简单的方法)。

type CT32 = CT32 of float
let x = CT32(1.2)

let CT32toFloat = function CT32 x -> x
let y = CT32toFloat x
let z = y.ToString()

作为替代方案(如果您的自定义类型是数字),您可以使用度量单位https://msdn.microsoft.com/en-us/library/dd233243.aspx他们没有运行时开销(我相信有区别的联合被编译为类)但在编译时提供类型安全性时间。

答案 2 :(得分:0)

您还可以使用inline deconstruction,它不需要修改类型本身。

来自F# for fun and profit的示例:

type EmailAddress = EmailAddress of string
let email = "foo" |> EmailAddress
let (EmailAddress email') = email // you can now access the email' string value