多种类型的F#函数类型注释

塔尔米奇

我正在尝试定义一个“准通用”函数。与其让它完全通用,不如说它仅适用于“整数”类型(即字节,sbyte,int16,uint16,int,uint32,int64,uint64,bigint)。

如何将其放入函数定义的类型注释中?为了明确起见,我将如何重写以下代码以使其实际工作(大概仅使用3种类型,而又不失一般性):

let square (x: int|int64|bigint) =
    x * x
内在之光

首先,无法在运行时使用标准.NET泛型来解决这种类型约束。

F#确实允许您通过在编译时解析约束并插入适当的函数调用来表达这种约束的有限形式。这利用了静态解析的类型参数

对于您描述的情况,这非常简单,您可以编写:

let inline square x = x * x

这对于定义'T*运算符的任何类型都适用

您还可以显式应用特定的静态/成员约束,但这需要更丑陋的语法,例如

let inline id item =
    ( ^T : (member Id : int) (item))

此示例函数将对任何公开Idtype属性的类型进行操作int


更新:根据您所描述的特定用例,您实际上可以进行类分类。这些实际上不是F#中存在的(除了一些硬编码示例),但是您可以使用标记类型和成员约束来模拟它们,这是一个示例:

type Marker =
    |Marker

    static member Multiply (marker : Marker, numX : int, numY : int) =
        numX * numY
    static member Multiply (marker : Marker, numX : int64, numY : int64) =
        numX * numY

let inline multiply x y =
    ((^T or ^U) : (static member Multiply : ^T * ^U * ^U -> ^S) (Marker, x, y))

multiply 5 7
multiply 5L 7L

请注意,这使您可以指定要启用该功能的确切类型。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章