2017-05-07 1 views
2

Compte tenu de ce code:Motif Elm correspondant sur la structure de données génériques

type Msg 
    = NoOp 
    | UpdateField ReqRes 


type ReqRes a 
    = Request a 
    | Response (Result Http.Error Bool) 


update : Msg -> Model -> (Model, Cmd Msg) 
update msg model = 
    case msg of 
     UpdateField reqres -> 
      case reqres of 
       Request a -> 
        -- Do stuff 
       Response result -> 
        -- Do stuff 
     _ -> 
      -- Do stuff 

Comme vous pouvez le voir, j'ai Msg nommé UpdateField, qui prend la UnionType ReqRes. Jusqu'ici tout va bien. Mais le type d'union a une structure de données générique (ou contient une variable de type ... est-ce que les deux signifient la même chose ???).

Mon problème est maintenant, que je ne sais pas comment faire correspondre sur ce point.

Le compilateur me dit cette erreur:

... Problem in this pattern match

The pattern matches things of type:

ReqRes a 

But the values it will actually be trying to match here are:

ReqRes 

Répondre

1

Si vous avez une variable de type (a) après la type ... = ou type alias ... =, il doit apparaître dans le côté gauche aussi.

De même, s'il existe un type ReqRes a, il doit toujours être vu avec a.

Donc, voici les changements nécessaires à votre code pour:

type Msg 
    = NoOp 
    | UpdateField ReqRes 

... becomes... 

type Msg a 
    = NoOp 
    | UpdateField (ReqRes a) 

et

update : Msg -> Model -> (Model, Cmd Msg) 

... becomes... 

update : Msg a -> Model -> (Model, Cmd (Msg a)) 
+0

Oha, tout à fait raison. Je vous remercie. J'ai reconnu que cela ferait exploser toute mon architecture. Hmm ... Plan était de simplifier ma fonction de mise à jour donc j'ai un Messsage qui peut gérer à la fois, Demandes et Réponses ... mais il y a des tonnes de changements pour y parvenir de cette façon, et ça ne ressemble pas à un nettoyage facile pour lire l'amélioration ... Peut-être que je devrais compter sur un lib comme remotedata ... – marschro