2013-05-01 55 views
3

非常簡單的例子:如何檢查函數的類型參數是否靜態解析?

  1. let myfun x = x
    在這裏,在智能感知它說: 「X: 'A - >' 了」。在FSI中,它表示「x:'a - >'a」
  2. let inline myfun x = x
    在智能識別系統中,它表示「x:'a - >'a」。在FSI中它說「x:'a - >'a」< < < <爲什麼不是^a
  3. let inline myfun (x: 'b) = x
    這裏在intellisense中說「x:'b - >'b」。在FSI中,它表示「x:'b - >'b」
  4. let inline myfun (x: ^b) = x
    在智能識別系統中,它表示「x:'b - >'b」。在它說,FSI 「X:^ B - >^B」 < < < <不同

由於智能感知從未顯示^b,我應該找^b作爲在FSI 「靜態解析」 的指標?

inline確保「靜態解決」?

+0

是的,它的確如此。這就是它的工作原理。 – 2013-05-02 06:20:29

回答

1

內聯確實允許但不強制靜態解析類型,這就是爲什麼在案例2中它仍然與案例1中一樣。 我認爲在大多數情況下,類型推理非常聰明,可以猜測類型是否應該是靜態的解決,即使你沒有指定^

例如,如果你的函數體改爲sqrt x的情況下3.你會得到

> let inline myfun (x: 'b) = sqrt x;; 
val inline myfun : ^b -> ^a when ^b : (static member Sqrt : ^b -> ^a) 

我個人一直儘量不要在第一次嘗試明確指定類型,那麼我檢查,如果我很高興推斷,如果我不是那麼我嘗試添加內聯,但不是帽子類型。

爲什麼intellisense有時顯示不同的東西?這可能是一個小錯誤。

+0

我認爲值得注意的是,在大多數情況下,放置'^'不會傳達任何附加信息,因爲參數約束只能在靜態解析的類型參數上進行。唯一的例外是我可以想到的情況是你明確指出參數具有靜態解析類型。 – mydogisbox 2013-05-02 13:07:09

相關問題