Wildcard per tipo quando corrispondono alle unioni discriminate
-
21-12-2019 - |
Domanda
Nel seguente esempio del mondo reale faccio una partita:
type Style = Nice | Cool | Ugly
type Color = Blue | Yellow | Orange | Grey | Cyan
type ClothingProperties = Style * Color
type Clothes =
| Jeans of ClothingProperties
| Pullover of ClothingProperties
| Shirt of ClothingProperties
type Person =
| Person of string * Clothes
let team = [Person("Jan", Jeans (Cool, Blue)); Person("Pete", Shirt (Nice, Cyan)); Person("Harry", Pullover (Ugly, Grey))]
let matchPerson person=
match person with
| Person(name, Jeans(Ugly,_) ) -> printfn "%s wears ugly stuff." name
| Person(name, Pullover(Ugly,_) ) -> printfn "%s wears ugly stuff." name
| Person(name, Shirt(Ugly,_) ) -> printfn "%s wears ugly stuff." name
| _ -> ()
List.iter(fun x->matchPerson x) team
.
C'è un modo per creare una corrispondenza più efficiente, quindi non ho bisogno di controllare ogni caso di abbigliamento?Qualcosa del genere:
let matchPerson person=
match person with
| Person(name, _ (Ugly,_) ) -> printfn "%s wears ugly stuff." name
| _ -> ()
.
Certo, questa non è la sintassi corretta.Ma come posso raggiungere un tale effetto?
Soluzione
Non è semplice, puoi usare la riflessione, ma il problema è che la tua sindacata discriminata ha bisogno di ridisegnare, perché se sai che ci saranno sempre una fabbrica di abbigliamento, quindi puoi cambiarlo su questo:
type Style = Nice | Cool | Ugly
type Color = Blue | Yellow | Orange | Grey | Cyan
type ClothingProperties = Style * Color // or just use a tuple
type Clothe =
| Jeans
| Pullover
| Shirt
type Clothes = Clothe *ClothingProperties
type Person =
| Person of string * Clothes
let matchPerson person=
match person with
| Person(name, (_,(Ugly,_)) ) -> printfn "%s wears ugly stuff." name
| _ -> ()
.
Un problema correlato è descritto qui è possibilePer passare tag dell'Unione discriminati come argomenti?
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow