2016-05-20 15 views
8

Ich habe einen einfachen Typ Provider, die Typen abhängig von meinem Parameter zur Verfügung stellen. Ich würde gerne wissen, ob es möglich ist, die Definition von "AskedTypeDefinitions" zu definieren, die eine andere "DependedTypeDefinition" erben würden.f # Typ Provider Vererbung

Ich weiß, dass statisch kann ich wie folgt vorgehen:

type People() = class end 

type Student() = 
    inherit People() 

type Teacher() = 
    inherit People() 

und dann kann ich Muster Spiel wie diese mit Typ Testmuster:

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

Was würde Ich mag in meiner Art tun Der Provider muss CreatedTypeDefinitions erstellen, die eine andere "DependencyTypeDefinition" erben. Wenn ich den Type-Provider verwende, um diese Typen zu erzeugen, kann ich eine Muster-Übereinstimmung auf ihnen finden (zum Beispiel weiß ich, dass zur Laufzeit einer dieser Typen instanziiert ist, aber ich weiß nicht welcher, außer dass es eine der bereitgestelltenTypeDefinitions ist)).

Vielen Dank für Ihre Zeit! statt Vererbung passende

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" 

Ich persönlich mag vermeiden Objektvererbung in FSharp Verwendung aufgrund upcasting and downcasting

Antwort

1

Versuchen Sie, eine diskriminierter Union für Muster. Beispiel:

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

Stattdessen empfehle ich, die Student- und Teacher-Analyse loszuwerden und die Leute die Besetzungslogik behandeln zu lassen.

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

Vielen Dank für Ihre Hilfe :). Das Problem mit dieser Lösung ist, dass TP keine DU oder Datensätze bereitstellt. Ich kann den von Ihnen beschriebenen Typ "Besetzung" nicht angeben. – Leleutch

+0

Hallo Leleutch, Ich habe meine Antwort bearbeitet, um die Art der Beschränkung aufzunehmen –

0

Vererbung zwischen bereitgestellten Typen ist ziemlich schwer. Sie können diese article lesen, um die Idee zu bekommen, wie Sie das tun können, aber selbst darin werden Sie sehen, dass der Autor trotz seiner besten Bemühungen wenig Erfolg hatte. Es scheint, dass die derzeitige Implementierung des Typ-Provider-Mechanismus in Bezug auf die Vererbung von bereitgestellten Typen von anderen bereitgestellten Typen nicht sehr entgegenkommend ist.

Mein Vorschlag für Sie ist viel einfacher, verwenden Sie einfach active patterns und Sie können auf alles, was Sie wollen, übereinstimmen.

Bearbeiten: in der Tat, Sie müssen nicht sogar aktive Muster verwenden, wie Sie Muster auf Typ trotzdem anpassen können.