2017-07-29 5 views
1

Ich versuche, meine Top-Level-Nachrichten an Untermeldungen zu trennen und damit tat i:Trennungsfunktion Haupt Aktualisierung basierend auf dem Teil Nachricht

type GeneratorMsg 
    = BoidsGenerated (List Boid) 
    | ColoursGenerated (List Color) 


type Msg 
    = Tick Time 
    | UpdateWorld Window.Size 
    | GeneratorMsg 

jedoch in meiner Haupt-Update-Funktion wenn ich die BoidsGenerated Nachricht Elm denkt, dass es vom Typ GeneratorMsg ist, die korrekt ist. In der gleichen Zeit aber - in meinen Gedanken - ist es vom Typ Msg.

Gibt es eine Möglichkeit der Lage sein zu handhaben Msg und GeneratorMsg austauschbar? Im Grunde möchte ich meine Update-Funktion auf kleinere Funktionen aufteilen, aber ich möchte alles, was mit generierten Sachen zu tun hat, von 1 separaten Funktion behandelt werden. Dann hat diese Funktion Fälle für BoidsGenerated und ColoursGenerated msgs. --- danke

Antwort

1

Was Sie hier haben, ist eine Kollision von Namen. Sie haben einen Typ namens GeneratorMsg sowie einen Konstruktor namens GeneratorMsg eines anderen Typs (Msg).

Die Art und Weise, wie Sie den GeneratorMsg Konstruktor Msg definiert haben, ist parameterlos und enthält keine Nutzinformationen. Sie benötigen einen Parameter zu definieren, die GeneratorMsg Wert zu tragen:

type Msg 
    = Tick Time 
    | UpdateWorld Window.Size 
    | GeneratorMsg GeneratorMsg 

Sie dann die Updates in einer separaten Funktion umgehen konnte, aber Sie werden zu Cmd.map müssen die GeneratorMsg in einen Msg Wert einpacken:

update : Msg -> Model -> (Model, Cmd Msg) 
update msg model = 
    case msg of 
     GeneratorMsg gmsg -> 
      let 
       (gmodel, newMsg) = 
        updateGenerator gmsg model 
      in 
       (gmodel, Cmd.map GeneratorMsg newMsg) 

     _ -> 
      ... 


updateGenerator : GeneratorMsg -> Model -> (Model, Cmd GeneratorMsg) 
updateGenerator gmsg model = 
    case gmsg of 
     BoidsGenerated boids -> 
      ... 

     ColoursGenerated colours -> 
      ... 
Verwandte Themen