榆树 - 将Msg变成Cmd Msg

时间:2017-03-09 18:56:59

标签: elm elm-architecture

我正在尝试修改elm-lang tutorial中的简单应用以首先更新模型,然后触发另一次更新。

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 )

所以我的Msg需要输入Cmd Msg。如何将“我的Msg变成Cmd Msg?

注意:我认识到有一种更简单的方法可以做出这种改变,但我正试图从根本上更好地理解榆树

2 个答案:

答案 0 :(得分:23)

确实没有必要将Msg变成Cmd Msg。请记住,update只是一个函数,因此您可以递归调用它。

您的NewTopic个案处理程序可以简化为:

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

如果您确实希望Elm Architecture为此方案启动Cmd,您可以对所需的map执行Cmd.none Msg的简单{<1}}:

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

(实际上并未推荐)

答案 1 :(得分:4)

添加以下功能:

run : msg -> Cmd msg
run m =
    Task.perform (always m) (Task.succeed ())

您的代码将变为:

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