2016-05-20 15 views
8

私は、自分のパラメータに応じて型を提供する単純型プロバイダを設計しました。他のProvidedTypeDefinitionを継承するProvidedTypeDefinitionsを定義することが可能かどうかを知りたいですか?f#型プロバイダの継承

私は静的に私は次の操作を行うことができることを知っている:

type People() = class end 

type Student() = 
    inherit People() 

type Teacher() = 
    inherit People() 

と、この使用タイプのテストパターンのような、私はできるパターンマッチ:私は私のタイプにしたいと思っ何

let f (x:People) = 
    match x with 
     | :? Student -> "Student" 
     | :? Teacher -> "Teacher" 
     | _ -> "Nothing !!" 

プロバイダーは、別のProvidedTypeDefinitionを継承するProvidedTypeDefinitionsを作成します。そのような型プロバイダを使用してそれらの型を生成すると、それらの型をパターン化できます(たとえば、実行時にこの型のインスタンスがインスタンス化されることはわかっていますが、それ以外の型はどれかが分かりません) )。

ありがとうございました!

答えて

1

は、私が個人的に原因upcasting and downcastingにfsharpでオブジェクトの継承を使用しないように好きなパターンマッチングの代わりに相続

type Occupation = 
    | Student 
    | Teacher 

type People(occupation) = 
    member this.Occupation = occupation 
class end 

type Student() = 
    inherit People(Student) 

type Teacher() = 
    inherit People(Teacher) 

let findPerson (person : People) = 
    match person.Occupation with 
    | Student -> "Student" 
    | Teacher -> "Teacher" 

のための識別型の共用体を使用してみてください。たとえば、

let person = new Student() :> People 
findPerson person 

代わりに、生徒と教師の解析を取り除き、人々が職業論理を処理するようにすることをおすすめします。

type Occupation = 
    | Student 
    | Teacher 

type People(occupation) = 
    member this.Occupation = occupation 
class end 

let findPerson (person : People) = 
    match person.Occupation with 
    | Student -> "Student" 
    | Teacher -> "Teacher" 

People Student 
|> findPerson 
|> printfn "%s" 
+0

ありがとうございました:)この解決策の問題は、TPがDUまたはレコードを提供しないことです。あなたが説明した '職業 'タイプを提供することはできません。 – Leleutch

+0

こんにちはルルーシュ、 タイプ拘束に対応するために私の答えを編集しました –

0

提供されるタイプ間の継承はかなり困難です。このarticleを読んで、これをどうやって行うことができるのかを知ることができますが、その中でさえ、作者が自分の努力にもかかわらずほとんど成功していないことがわかります。型プロバイダ機構の現在の実装は、提供された型の他の提供された型からの継承に関してあまり適応していないようです。

あなたの提案ははるかに簡単です。ちょうどactive patternsを使用して、あなたが望むものにマッチすることができます。

編集:実際には、アクティブパターンを使用する必要はありません。なぜなら、とにかくタイプでパターンマッチングを行うことができるからです。