2011-11-11 3 views
3

F#メソッドにダックタイピングを追加する方法を検討してきました。F#:一見動的な型を作成するのに役立つメンバーの制約

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

ここで、パラメータは、そこにTestメソッドがあります。私はこのような表記を見てきました:

一般的な制約ではなく、クラス/インタフェースレベルよりもメソッドレベルでenforeするために使用することができますように私にはのように見えます
member inline public x.Testing< ^a when ^a : (member public Test : String-> String)>(model:^a) = 
    let something = model.Test("") 
    ignore 

。問題は型の問題のためにコンパイルできないということです。これは、メソッドレベルで制約を指定する方法がないと私に信じさせる。それは重力ですか?

答えて

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を:) –

関連する問題