我正在尝试修改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?
”注意:我认识到有一种更简单的方法可以做出这种改变,但我正试图从根本上更好地理解榆树
答案 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)