2017-07-29 4 views
1

私はサブのメッセージに私のトップレベルのメッセージを分離しようとしていますので、私がやった:サブメッセージに基づいて、メインのアップデート機能を分割

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


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

しかし、私の主な更新機能で、私はを使用する場合BoidsGeneratedメッセージエルムは、それが正しいタイプのGeneratorMsgだと思っています。私の考えでは、同じ時間に、タイプ、メッセージです。

メッセージと互換可能GeneratorMsg扱うことができるようにする方法はありますか?基本的には、私は小さな関数に私の更新関数を分割したいが、私は生成されたものとは1つの別個の関数で処理されなければならないすべてを望む。その関数はのケースを持ちます.BoidsGeneratedColoursGenerated msgs。 ---ありがとう

答えて

1

名前の衝突です。 GeneratorMsgというタイプと、異なるタイプのGeneratorMsgMsg)というコンストラクターがあります。

GeneratorMsgコンストラクタをMsgに定義した方法は、パラメータなしであり、情報のペイロードは含まれていません。

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

あなたはその後、別の関数で更新を扱うことができるが、あなたがMsg値にGeneratorMsgをラップするCmd.mapする必要があります:

あなたは GeneratorMsg値を運ぶために、パラメータを定義する必要があります
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 -> 
      ... 
関連する問題