2017-06-08 1 views
1

Dans Elm, je me trouve parfois en train de définir un type d'enregistrement en utilisant un type d'union avec un seul constructeur. Je puis utiliser un cas déclaration avec un seul cas pour décompresser les champs d'enregistrement:Utilisation d'un seul type d'union de constructeur

type Model = 
    Model { stack: List Int } 

update msg model = 
    case model of 
     Model { stack } -> 
      ... 

Est-il un moyen plus court de déballer cela? Le cas d'un cas semble stupide. Cela provoque une indentation et une verbosité inutiles. En outre: J'utilise type au lieu de type alias pour être plus explicite lorsque je traite les structures de données centrales dans un programme (qui ont tendance à avoir peu de champs et ne sont utilisés que dans quelques endroits du programme, donc l'extra verbosité n'est pas que beaucoup d'un problème). Serait-il préférable d'abandonner cette approche et d'utiliser un alias de type pour les enregistrements chaque fois que cela est possible?

+0

Comme le note Tchad ci-dessous, votre enveloppement du modèle dans un constructeur de type n'est pas particulièrement nécessaire. C'est plus commun parmi les auteurs de bibliothèque que dans ceux qui écrivent des applications –

Répondre

4

Vous pouvez match de motif dans la signature de la fonction elle-même:

update msg (Model model) = 
    model.stack ... 

ou, si vous voulez utiliser stack directement:

update msg (Model { stack }) = 
    ... 

Quant à savoir si vous devez faire ce type de chose? Je l'ai utilisé dans le passé en essayant explicitement de cacher les détails d'implémentation d'un modèle. Vous devez juste être prêt à faire face à la verbosité supplémentaire qu'il introduit inévitablement. C'est vraiment à vous de décider si c'est nécessaire. Je pencherais probablement pour l'éviter à moins d'un besoin explicite.