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?