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

问题描述 投票:3回答:3

我已经为我的应用程序域设计了自定义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#强制转换运算符,但是似乎没有一个允许我访问类型所包含的基本基元值。是否有一种简单的方法可以获取自定义类型中的原始值,因为到目前为止,它们比实际使用的更令人头疼。

types casting f# primitive
3个回答
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。它们没有运行时开销(我相信有区别的联合会编译为类),但在编译时提供类型安全性。


5
投票

添加对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

0
投票

您也可以使用不需要对类型本身进行修改的inline deconstruction

[C0中的示例:

F# for fun and profit
© www.soinside.com 2019 - 2024. All rights reserved.