2017-03-09 6 views
5

elm-lang tutorialから単純なアプリケーションを修正して、最初にモデルを更新してから別の更新をトリガーしようとしています。Elm - MsgをCmd Msgに変更

update msg model = 
    case msg of 
    MorePlease -> 
     (model, getRandomGif model.topic) 

    NewGif (Ok newUrl) -> 
     ({ model | gifUrl = newUrl }, Cmd.none) 

    NewGif (Err _) -> 
     (model, Cmd.none) 

    -- my addition 
    NewTopic newTopic -> 
     ({ model | topic = newTopic}, MorePlease) 

NewTopic支店ので、これは、コンパイラに失敗します。だから私のメッセージは、タイプCmdをメッセージする必要があります

The 3rd branch has this type: 

({ gifUrl : String, topic : String }, Cmd Msg) 

But the 4th is: 

({ gifUrl : String, topic : String }, Msg) 

。どのように私はCmdをメッセージの中に「私のメッセージを有効にすることができます

注:?私はこの変更を行うための簡単な方法がある認識が、私はもっと根本的

答えて

13

ノー本当にありエルムを理解しようとしていますCmd MsgMsgを有効にする必要がありますが、再帰的にそれを呼び出すことができますので、updateは単なる関数であることを覚えておいてください

あなたNewTopicケースハンドラは、このように単純化することができます。。

NewTopic newTopic -> 
    update MorePlease { model | topic = newTopic} 

あなたが本当に本当にこのシナリオでCmdをオフ発射するエルムの建築を望んでいた場合は、ご希望のMsgCmd.noneの簡単なmapを行うことができます:

NewTopic newTopic -> 
    ({ model | topic = newTopic}, Cmd.map (always MorePlease) Cmd.none) 

(実際にはお勧めしません)

+0

をありがとうございました。これは、問題を簡単に解決する方法です。私はまだ疑問に思う。「メッセージ」を「メッセージ・メッセージ」に「キャスト」する必要があるだろうか?そしてもし私がすればどうしますか? – steel

+0

私の答えは、 –

+0

@ChadGilbertの例で更新しました。新しい 'Msg'を起動して2番目の方法を推奨しない理由をもっと詳しく説明できますか? – DanEEStar

関連する問題