Generics f#为多种类型和重载运算符定义泛型函数

Generics f#为多种类型和重载运算符定义泛型函数,generics,f#,Generics,F#,我试图定义一个内联函数,它可以以通用的方式对多种类型(包括用户定义的类型)执行算术运算。 然而,内联函数似乎过早地推断了它的类型 我的自定义类型如下所示: type ^T Foo (x: ^T) = static member inline (*) (x: ^T, y: Foo< ^T>) = Foo x 在保持简单的同时编写G类泛型函数的最佳方法是什么?问题是F类型推理在这里使用弱分辨率: let inline G x = 1 * x // G inferred as i

我试图定义一个内联函数,它可以以通用的方式对多种类型(包括用户定义的类型)执行算术运算。 然而,内联函数似乎过早地推断了它的类型

我的自定义类型如下所示:

type ^T Foo (x: ^T) =
    static member inline (*) (x: ^T, y: Foo< ^T>) = Foo x
在保持简单的同时编写G类泛型函数的最佳方法是什么?

问题是F类型推理在这里使用弱分辨率:

let inline G x = 1 * x // G inferred as int -> int
也就是说,在存在二进制运算符的情况下,它使用一个运算符是已知类型的证据来匹配另一个具有相同类型的运算符

在将来的版本中,如果存在内联关键字,此行为可能会发生更改

目前,编写函数的标准方法是使用通用方法:

let inline G x = LanguagePrimitives.GenericOne * x

谢谢,这解释了很多。如果我想用一个不是一的数字乘以它呢?是否可以使用自定义数字文字或引号解决此问题?或者我可以全局重载运算符(+)并以某种方式延迟类型推断吗?是的,有一些方法可以处理泛型文字,主要使用泛型转换。您可以查看FSharpPlus中的通用数学模块。
let inline G x = LanguagePrimitives.GenericOne * x