F# 通用结构构造函数和错误 FS0670

Gan*_*oss 5 generics f# constructor struct

我在 StackOverflow 中发现了一些有关错误 FS0670 ( This code is not sufficiently generic. ...) 的问题,但所提出的解决方案都不能很好地解决我的问题(我是初学者,也许我错过了 F# 的一些概念)。

我有以下通用结构,我希望仅适用于原始类型(即 int16/32/64 和 single/float/decimal)。

[<Struct>]
type Vector2D<'T when 'T : struct and 'T:(static member get_One: unit -> 'T) and 'T:(static member get_Zero: unit -> 'T) > = 

    val x : 'T
    val y : 'T

    new( xp: 'T, yp: 'T ) = { x = xp; y = yp }
Run Code Online (Sandbox Code Playgroud)

但使用新的构造函数时,我收到提到的错误 FS0670。

有人知道可能的解决方案吗?提前谢谢了。

Nik*_*ird 4

结构体上不能有静态解析的类型参数

它们仅对内联函数有效。在这种情况下,您尝试执行的操作(将类型参数限制为需要特定方法)是不可能的。

最接近的方法是从结构中删除成员约束并创建为您处理结构的内联函数:

[<Struct>]
type Vector2D<'T when 'T : struct> =
    val x : 'T
    val y : 'T

    new( xp: 'T, yp: 'T ) = { x = xp; y = yp }

let inline create< ^T when ^T : struct and ^T:(static member get_One: unit -> ^T) and ^T:(static member get_Zero: unit -> ^T)> (x : ^T) (y : ^T) =
    Vector2D< ^T> (x, y)


create 2.0 3.0 |> ignore
create 4   5   |> ignore
Run Code Online (Sandbox Code Playgroud)

  • 其实你可以拥有它们。问题是,一旦在类型(或结构)级别声明它们,所有成员都必须是内联的。F# 解析器似乎无法处理内联“new”关键字,这似乎是一个问题。 (3认同)