J'ai des syndicats discriminés imbriqués
let dogPrinter = function
| Chihuahua -> ""
| GermanShepherd g ->
match g with
| Sniff -> ""
| Guard -> ""
Voici une fonction qui prend un Chien et renvoie une chaîne .
let dogPrinter d =
match d with
| Chihuahua -> ""
| GermanShepherd g ->
match g with
| Sniff -> ""
| Guard -> ""
Je peux convertir la première correspondance en syntaxe function :
type Job = Sniff | Guard type Dog = Chihuahua | GermanShepherd of Job
Comment puis-je convertir la deuxième correspondance en fonction?
3 Réponses :
La seule façon dont je pourrais penser, qui, à mon avis, pourrait généralement être la meilleure approche, car elle sépare les préoccupations de manière appropriée. Cependant, je ne pense pas que ce mot-clé function ajoute une valeur. Je m'en tiens généralement au mot clé match .
let jobPrinter = function | Sniff -> "" | Guard -> "" let dogPrinter = function | Chihuahua -> "" | GermanShepherd job -> job |> jobPrinter
La manière idiomatique d'éviter les correspondances imbriquées dans des scénarios comme celui-ci est d'utiliser des modèles imbriqués:
let dogPrinter = function
| Chihuahua -> ""
| GermanShepherd Sniff -> ""
| GermanShepherd Guard -> ""
Vous pouvez imbriquer des modèles aussi profondément que vous le souhaitez, tout comme vous pouvez imbriquer des expressions lors de la création du valeurs.
Bien que je pense que la réponse @glennsl est ce que vous devriez envisager de faire, voici une réponse à ce que OP a demandé:
type Job = Sniff | Guard
type Dog = Chihuahua | GermanShepherd of Job
let dogPrinter = function
| Chihuahua -> "Voff"
| GermanShepherd g ->
g |> ( function
| Sniff -> "Sniff"
| Guard -> "Guard"
)
Cela semble être un problème XY . Pourquoi voulez-vous faire cela? Il est parfaitement lisible tel quel. Vous pouvez cependant utiliser des modèles imbriqués pour éviter la deuxième correspondance.
Pourquoi? Je me demande juste comment. Qu'entendez-vous par motifs imbriqués? Pouvez-vous poster une réponse?