2010-08-17 48 views
10

我試圖用顯式類型參數和約束定義運營商明確的類型參數:F#:在運營商捆綁

let inline (===)<'a, 'b 
    when 'a : not struct 
    and 'b : not struct> a b = obj.ReferenceEquals (a,b) 

它運作良好,在F#2.0,但產生的:

警告FS1189:
類型參數必須直接放置在類型名稱旁邊的 ,例如「型 Ç<「T>」,而不是鍵入「C <」 T>」

那麼,什麼是爲運營商定義做明確的類型參數規格的正確方法?

p.s.請不要告訴我關於隱式類型參數和其他一些解決方法,我想具體解決這個問題。

回答

12

編譯器中的錯誤意味着符號運算符永遠不會被視爲直接與類型參數相鄰。您可以通過例如

let inline myeq<'a, 'b 
    when 'a : not struct 
    and 'b : not struct> a b = obj.ReferenceEquals (a,b) 

let inline (===) a b = myeq a b 
+1

另外有源圖案具有相同的錯誤: '讓(| SomePatternName |)<'a, 'b> X = x' – ControlFlow 2010-09-01 10:58:41

4
let inline (===) (a : 'TA when 'TA : not struct) (b : 'TB when 'TB : not struct) = 
    obj.ReferenceEquals (a,b) 
+0

良好,但是這不是顯式類型參數;) – ControlFlow 2010-08-17 11:25:22