Generics 缺少类型约束的泛型数组之和

Generics 缺少类型约束的泛型数组之和,generics,f#,Generics,F#,我正在尝试编写一个简单的数组加法函数。唯一的复杂性来自于我试图使其通用。我知道在C#中,值类型没有类型约束,但我的理解是F#可以使它与值类型一起工作。以下是我的尝试: let Add<'T when 'T : (member (+) : 'T -> 'T -> 'T)> (A : 'T[]) (B : 'T[]) = Array.init A.Length (fun i -> A.[i] + B.[i]) 我确信这只是一个语法问题,有人能给我指出正确的地方

我正在尝试编写一个简单的数组加法函数。唯一的复杂性来自于我试图使其通用。我知道在C#中,值类型没有类型约束,但我的理解是F#可以使它与值类型一起工作。以下是我的尝试:

let Add<'T when 'T : (member (+) : 'T -> 'T -> 'T)> (A : 'T[]) (B : 'T[]) =
    Array.init A.Length (fun i -> A.[i] + B.[i])
我确信这只是一个语法问题,有人能给我指出正确的地方吗


p、 美国:是否有其他/更简单的方法来实现这一点,或者这是使其正常工作的正确方法?

标记函数
内联
。然后将推断约束

let inline Add (A : 'T[]) (B : 'T[]) =
  Array.init A.Length (fun i -> A.[i] + B.[i])
您的函数也可以这样编写:

let inline add a b = Array.map2 (+) a b
编辑

要使约束显式,可以这样做(看起来很糟糕)

当^T:(静态成员(+):^T*^T->^T)>(A:^T[])(B:^T[])时,让内联添加<^T=
Array.init A.Length(有趣的i->(^T:(静态成员(+):^T*^T->^T)(A[i],B[i]))
但它产生了警告:

名为“op#u Addition”的成员约束由F#编译器赋予特殊状态,因为某些.NET类型会隐式地增加此成员。如果试图从自己的代码中调用成员约束,则可能会导致运行时失败


将函数标记为
内联
。然后将推断约束

let inline Add (A : 'T[]) (B : 'T[]) =
  Array.init A.Length (fun i -> A.[i] + B.[i])
您的函数也可以这样编写:

let inline add a b = Array.map2 (+) a b
编辑

要使约束显式,可以这样做(看起来很糟糕)

当^T:(静态成员(+):^T*^T->^T)>(A:^T[])(B:^T[])时,让内联添加<^T=
Array.init A.Length(有趣的i->(^T:(静态成员(+):^T*^T->^T)(A[i],B[i]))
但它产生了警告:

名为“op#u Addition”的成员约束由F#编译器赋予特殊状态,因为某些.NET类型会隐式地增加此成员。如果试图从自己的代码中调用成员约束,则可能会导致运行时失败


好极了知道为什么编译器对我的版本不满意吗?知道。显式成员约束要求
inline
。无论是声明函数
inline
,还是您的语法有点错误,我都会遇到相同的错误。但是,
(+)
上的约束对编译器有特殊意义,并会生成警告。可怕是一种轻描淡写的说法。谢谢好极了知道为什么编译器对我的版本不满意吗?知道。显式成员约束要求
inline
。无论是声明函数
inline
,还是您的语法有点错误,我都会遇到相同的错误。但是,
(+)
上的约束对编译器有特殊意义,并会生成警告。可怕是一种轻描淡写的说法。谢谢