2
對我來說,似乎編譯器具有該點的所有信息,但我收到錯誤消息。爲什麼?爲什麼這個帶有成員約束的F#代碼不能編譯?
let inline getLength< ^a when ^a : (member Length : int) > (x: ^a) = x.Length
對我來說,似乎編譯器具有該點的所有信息,但我收到錯誤消息。爲什麼?爲什麼這個帶有成員約束的F#代碼不能編譯?
let inline getLength< ^a when ^a : (member Length : int) > (x: ^a) = x.Length
要調用由靜態約束所需的一員,你需要使用一個更復雜的語法:
let inline getLength< ^a when ^a : (member Length : int) > (x: ^a) =
(^a : (member Length : int) x)
這是一個有點難看 - 我想強調的是靜態成員約束點不是實現事物的主要方式(通常,您可以使用接口或其他更常用的技術)。另外,如果您主要對數學代碼感興趣,那麼您可以只使用標準的運算符和函數(與LanguagePrimitives
中的幾個基元一起),並且不必顯式調用成員。
所以我必須使用約束調用表達式每次我想訪問約束中指定的成員? – ironic
是的,先驗你。雖然,我想你是在一個數組上調用長度?在這一點上,你可以寫'let getLength(x:'a array)= x.Length' –
@ironic - 是的,但是一旦你定義了'getLength',你就可以使用這個函數來獲取長度其他函數),約束將自動傳播。但我認爲@DanielFabian其實就在這裏,你可能只是想要一個簡單的數組:-) –