如何通过Measure类型自身的静态成员New直接生成一个bool成员类型?

3

如何在F#中创建一个具有静态成员New的Measure Type,该成员可以接受一个值并为布尔值生成给定的Measure Type?

我已经用于int、int64和decimal,这些都运行得很完美。

    [<Measure>] type MyInt = static member New value = value * 1<MyInt>
    [<Measure>] type MyInt64 = static member New value = value * 1L<MyInt64>
    [<Measure>] type MyDecimal = static member New value = value * 1m<MyDecimal>

但是这个不起作用:
    [<Measure>] type MyBool = static member New value = value * true<MyBool>

编译错误是意外的标记'>'或不完整的表达式 我也遇到了这个问题,包括字符串和日期时间。我的目标是基本使用度量类型提供编译时检查,而不需要单个案例联合类型包装的运行时性能损失。(有关参考,请参见Jack P.的此答案
理想情况下,我希望将此概念用于所有类型,但我不知道如何处理非数字类型。

LanguagePrimitives.GenericOne 不就等于所有的 new 函数吗?- 至少数值类型是这样,布尔类型还没有测试。 - John Palmer
我没有想过使用那个。我得去检查一下。 - Aaron Palmer
我尝试将1<MyInt>替换为GenericOne,但这并没有返回一个int<MyInt>,而只是返回了int。我尝试将1<MyInt>替换为GenericOne<MyInt>,但编译器报错Expected type, not unit-of-measure - Aaron Palmer
1
此外:使用 1<_> 进行单位转换的乘法可以很好地替换为类似于 LanguagePrimitives.Int32WithMeasure<MyInt> 17 的内容。 - Anton Schwaighofer
1个回答

4

所以,只有特定的内置类型具有内置的测量类型定义。

根据规范,这些类型包括:

type float<[<Measure>] 'U>
type float32<[<Measure>] 'U>
type decimal<[<Measure>] 'U>
type int<[<Measure>] 'U>
type sbyte<[<Measure>] 'U>
type int16<[<Measure>] 'U>
type int64<[<Measure>] 'U>

对于其他类型,您可以定义自己的类型。

对于数字类型,您可以使用LanguagePrimitives.Int32WithMeasure等编写自己的new函数,实际上对于浮点数而言这样会更快。我认为最近其他数字类型已经进行了优化,因此乘以1的操作都是在编译时完成的。


1
感谢您的帮助,非常感激。我将采用这种方法,并为规范中没有的类型定义度量类型。如果编译时“标记”域类型能够更好地与语言本身集成,那就太好了。 - Aaron Palmer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接