2016-06-01 6 views
2

Ich bin ein neuer Programmierer im Allgemeinen und auch zu F #. Ich bin auf dieses spezielle Problem mehrmals gestoßen und muss es meiner Meinung nach noch effizient lösen. Hier ist das Problem:Überprüfen Sie mehrere Optionstypen und konvertieren Sie dann zu Typ

Ich habe diese Beispiel-Typen:

type Retail1 = | Fashion | Auto | Sports 
type Wholesale1 = | Fashion | Auto | Sports 
type Events1 = | Wedding | Birthday 

type Product = 
     | Retail of Retail1 | Wholesale of Wholesale1 | Events of Events1 
     | NoProduct 

Ich mag die Möglichkeit, die ersten drei Typen auf den Produkttyp über eine Funktion konvertieren:

let convertToProduct (retail: Retail1 option) 
     (wholesale: Wholesale1 option) (events: Events1 option) = 
     // convert to Product here 
     if retail.IsSome then Retail retail 
     elif wholesale.IsSome then Wholsale wholseale 
     elif events.IsSome then Events events 
     else NoProduct 

Die Art und Weise dass ich es im Pass gehandhabt habe, ist nur eine lange if elif-Anweisung zu verketten, um nach jeder Bedingung zu suchen und die endgültige Art des Produkts zurückzugeben, aber das fühlt sich nicht korrekt an oder zumindest idiomatisch zu F #. Was wäre der empfohlene Ansatz für dieses Problem?

+0

Wäre es möglich, eine Eingabe wie folgt zu haben: 'convertToProduct (Some (Retail1.Fashion)) None (Some (Wedding))'? Wenn ja, dann müssen Sie Ihre Typen überdenken. –

+0

Von Interesse: [Argumentation über funktionale Typen] (http://tomasp.net/blog/types-and-math.aspx/) –

Antwort

4

Wie wäre es etwa so:

let convertToProduct (retail: Retail1 option) (wholesale: Wholesale1 option) (events: Events1 option) = 
    match (retail, wholesale, events) with 
    |Some rt, None, None -> Retail rt 
    |None, Some wh, None -> Wholesale wh 
    |None, None, Some ev -> Events ev 
    |_ -> NoProduct 

Dies nutzt die Tatsache, dass, wenn man alle Argumente in ein Tupel zu konvertieren, können Sie ziemlich präzise Muster auf das Ergebnis passend tun.

Mustererkennung ist tatsächlich extrem leistungsfähig, Sie können mehr Details über die Arten von Muster finden, die Sie in der MSDN documentation durchführen können.

Verwandte Themen