2011-11-11 40 views
3

我一直在尋找一種方法來爲F#方法添加一些鴨子打字。F#:幫助創建看似動態類型的成員約束

SomeMethod(model:'a) = 
    let someField = model.Test("") 

哪裏來在參數上有測試方法。我見過的符號是這樣的:

member inline public x.Testing< ^a when ^a : (member public Test : String-> String)>(model:^a) = 
    let something = model.Test("") 
    ignore 

它看起來像,我認爲通用的約束可以用於在方法層面,而不是類/接口級enfore表示。問題是由於類型問題,我無法編譯它。這使我相信,沒有辦法在方法級別指定約束。這是否合併?

回答

5

這樣的語法有點笨拙,但在這裏。

type Foo() = 
    member inline public x.Testing(model) = 
    let something = (^a : (member Test : string -> string) (model, "")) 
    ignore 

你可能最好使用一個接口:

type IModel 
    abstract Test : string -> string 
+0

+1只爲建議使用的接口:) –