注:這個問題在一定程度上關係到我previous one,但它實際上是從不同的角度接觸問題上的ToString()對字符串操作的類型推斷
考慮下面的代碼片段:
let toStr a = a.ToString()
let strOp a = string a
let intToStr = 5 |> toStr
let floatToStr = 5.0 |> toStr
let intStrOp = 5 |> strOp
let floatStrOp = 5.0 |> strOp //type inference error
雖然strOp
函數使用看起來更優雅的解決方案,並且能夠將單位值轉換爲字符串,它似乎不是真正通用的,因爲它的類型在第一次使用期間受到限制(即使推斷的類型是obj -> string
,而不是'a -> string
)
爲什麼字符串操作符不以這種通用的方式工作?或者我做錯了什麼?
'let inline strOp a = string a' – PetSerAl
這是在這裏成功實現更高主動多態性的着名技巧嗎?如果我的問題是關於這個問題的,爲什麼ToString示例工作?我沒有區別。 –
因爲'toStr'是一個真正的泛型函數,而'strOp'實例化一個帶有靜態解析類型約束的內聯函數,但它本身不是內聯的,所以不會繼承泛型。這可能有助於解釋細節:http://stackoverflow.com/questions/30445828/f-generics-function-overloading-syntax/30446386#30446386 –