在F#中,运算符重载看起来很强大,但正确使用也很棘手。我有以下类:
如果我使用冒号为 + 定义另一个重载函数:
编译器报错:
type Value<'T> =
with
static member inline (+) (a : Value<'U>, b: Value<'U>) : Value<'U> =
do stuff
如果我使用冒号为 + 定义另一个重载函数:
static member inline (+) (a : Value<'U>, b: 'U) : Value<'U> =
do stuff
它可以工作。但是如果我想要一个对称运算符:
static member inline (+) (b: 'U, a : Value<'U>) : Value<'U> =
do stuff
编译器报错:
let a = Value<int>(2);
let b = a + 3 // ok
let c = 3 + a //<-- error here
错误3 类型推断问题过于复杂(达到了最大迭代深度)。考虑添加进一步的类型注释
是否有解决方法可以保持泛型?
我在使用F#3.1版本。
谢谢
(^a or ^b or ...)
部分中使用具有超过2种类型的命名方法。这需要显式注释,但似乎要少得多地进行黑客攻击。 - kvb