2014-02-25 84 views

回答

6

要調用由靜態約束所需的一員,你需要使用一個更復雜的語法:

let inline getLength< ^a when ^a : (member Length : int) > (x: ^a) = 
    (^a : (member Length : int) x) 

這是一個有點難看 - 我想強調的是靜態成員約束點不是實現事物的主要方式(通常,您可以使用接口或其他更常用的技術)。另外,如果您主要對數學代碼感興趣,那麼您可以只使用標準的運算符和函數(與LanguagePrimitives中的幾個基元一起),並且不必顯式調用成員。

+0

所以我必須使用約束調用表達式每次我想訪問約束中指定的成員? – ironic

+0

是的,先驗你。雖然,我想你是在一個數組上調用長度?在這一點上,你可以寫'let getLength(x:'a array)= x.Length' –

+1

@ironic - 是的,但是一旦你定義了'getLength',你就可以使用這個函數來獲取長度其他函數),約束將自動傳播。但我認爲@DanielFabian其實就在這裏,你可能只是想要一個簡單的數組:-) –