在F#中,操作符重載看起來很強大,但也很難得到正確的結果。 我有以下類:F#操作符重載謎語2
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
感謝
嗨古斯塔沃,謝謝你的這個把戲。我認爲這是唯一的解決方法。如果我有更多類型,如價值<'T>,這個技巧會工作嗎? – Liviu
我不知道的事情:A)你可以定義三元運算符。這是一個黑客。 B)雖然?< - 與記錄參數是三元的,但如果我將它稱爲(?< - )(sum,a,b),它不會編譯... – Liviu
是的,它可能適用於更多類型,但它不是直截了當的。除(?< - )以外,您不能定義三元運算符,調用它的方式是(?< - )a b c或? (b)< - c沒有元組調用。 – Gustavo