gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 18:21:00 24 4
gpt4 key购买 nike

我正在尝试定义一个“准通用”函数。而不是让它完全通用,我希望它只适用于“整数”类型(即字节、sbyte、int16、uint16、int、uint32、int64、uint64、bigint)。

如何将其放入函数定义的类型注释中?为了澄清,我将如何重写以下代码以使其实际工作(仅使用 3 种类型,大概不会失去泛化):

let square (x: int|int64|bigint) =
x * x

最佳答案

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

F# 确实允许您通过在编译时解析这些约束并插入适当的内联函数调用来表达此类约束的有限形式。这利用了 statically resolved type parameters .

对于您所描述的情况,这很简单,您只需编写:

let inline square x = x * x

这适用于任何类型 'T其中有 *运算符定义。

您还可以显式应用特定的静态/成员约束,但这需要更丑陋的语法,例如
let inline id item =
( ^T : (member Id : int) (item))

此示例函数将对任何公开 Id 的类型进行操作。类型的属性 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

请注意,这允许您指定要允许该功能的确切类型。

关于generics - 多种类型的 F# 函数类型注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43786232/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com