2017-10-17 6 views
1

Dans les langages fonctionnels, on peut ajouter une condition à une branche d'une correspondance de motif: par exemple, en OCaml:Comment ajouter une condition à un match en cas de ...

let value = match something with 
| OneThing -> "1" 
| Another when condition -> "2" 
| _ -> "3" 

Comment faire ceci en orme? J'ai essayé when et if, mais rien n'a fonctionné.

Répondre

5

Elm n'a pas de conditionnalité dans la correspondance de motif, probablement parce que les concepteurs de langage ont tendance à préférer garder la syntaxe petite et simple.

Le mieux que vous pouvez faire est quelque chose comme ceci:

let 
    value = 
     case something of 
      OneThing -> 
       "1" 

      Another -> 
       if condition then 
        "2" 
       else 
        ... 

      _ -> 
       "3" 
3

Comme alternative à l'utilisation d'un if au sein de la branche case, vous voudrez peut-être correspondre à la place contre un tuple contenant la condition, qui ressemblerait this:

let 
    value = 
     case (something, condition) of 
      (OneThing, _) -> 
       "1" 

      (Another, True) -> 
       "2" 

      _ -> 
       "3" 
+0

Cette solution n'est bonne que lorsqu'il y a une condition dans les branches. Si vous voulez deux conditions différentes, ce n'est plus possible. – Boiethios

+0

@Boiethios, il devient certainement plus poilu si vous introduisez plusieurs conditions, et je recommanderais de passer à l'option 'if' /' else' dans ce cas. Cependant, je ne pense pas qu'il y ait quelque chose d'impossible à avoir deux conditions différentes, vous ajoutez simplement un autre élément au tuple sur lequel vous vous associez. Voir https://ellie-app.com/mkqNvychwa1/0, laissez-moi savoir si votre signification me manque – bdukes

+0

Vous avez raison, je n'y ai pas pensé. Cependant, comme vous le dites, cette méthode encombrera rapidement le code tout en ajoutant des conditions. Dans mon projet d'apprentissage, je suis passé à 'if' ...' else'. Ce choix de la part de l'équipe d'orm ne tient pas * le * langage "simple" de l'OMI car il oblige à écrire du code moins lisible (exemple: https://gitlab.com/snippets/1679916#L73) Peut-être que je posterai à ce sujet dans leur dépôt . – Boiethios