1
votes

Convertir une expression de correspondance imbriquée en fonction

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?


2 commentaires

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?


3 Réponses :


1
votes

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


0 commentaires

5
votes

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.


0 commentaires

1
votes

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"
            )


0 commentaires