2017-03-09 73 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分支:

The 3rd branch has this type: 

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

But the 4th is: 

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

所以我的消息必須鍵入Cmd消息。我怎樣才能把」我的消息成一個cmd消息

注:我承認有一個簡單的方式,這種改變的方式,但我想了解更多榆樹根本

回答

13

實在是沒有需要把MsgCmd Msg記住update僅僅是一個函數,所以你可以遞歸調用它

NewTopic辦案人員可以簡化爲這樣:。

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

如果你真的真的想榆樹建築火災關閉一個cmd對於這種情況,你可以做的Cmd.none簡單map到你想要的Msg

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

(實際上並不推薦)

+0

謝謝。這是解決問題的一種更簡單的方法。我仍然想知道,我是否需要將「Msg」「投射」到「Cmd Msg」?如果我做了我會怎麼樣? – steel

+0

我用一個例子更新了我的答案 –

+0

@ChadGilbert:你能詳細闡述一下爲什麼你不會推薦新的'Msg'來推薦第二種方法嗎? – DanEEStar

相關問題