【发布时间】:2016-12-06 15:08:05
【问题描述】:
我需要一个可以访问数字类型的MinValue 和MaxValue 的数字泛型函数。由于所有 BCL 类型都有这些成员,我想我可以写这样的东西:
let inline zeroOrMax(x: ^a) =
match x with
| a when a = LanguagePrimitives.GenericZero -> x
| a when a = LanguagePrimitives.GenericOne ->
let maxVal = (^a: (static member MaxValue : ^a) ())
maxVal
| a when -a = LanguagePrimitives.GenericOne ->
let maxVal = (^a: (static member MaxValue : ^a) ())
-maxVal
| _ -> ...
此函数将为您提供基础类型的零或(负/正)最大值。
当我创建自己的实现MaxValue 的类型时,可以找到此方法,但是虽然Int32、Int64 等具有静态成员MaxValue 和MinValue,但我不断收到参数没有的静态编译错误已经说过静态成员:
let test (x: int64) =
// error FS0001: The type 'int64' does not support the operator 'get_MaxValue'
zeroOrMax x
我认为这是因为 F# 特别对待这些类型。或者也许我只是需要一种不同的语法。有没有办法在保持数值通用性和访问基础类型的最小值/最大值的同时解决这个问题?
【问题讨论】:
-
int64.MaxValue是一个成员常量,而不是一个属性。 -
@fyodor 哎哟,dejavu,感觉就像我之前看到的一样。猜猜没有比这更简单的解决方法了吗?
-
不,没有办法。我在FsControl 中创建了一个generic function,由overloading many different types 执行此操作。您可以使用它或复制那里的代码。
-
@Gustavo,有趣的方法。我在沿着这些思路思考(我希望把一些东西放在一起,猜想这还不会发生)。另一种欺骗系统的方式导致了 F# 的奇怪(或不是?)行为,reported here。
-
有趣的错误报告,一如既往。我将从该通用函数中添加一些代码作为答案。