我试图修改一个简单的应用程序,使其首先更新模型,然后触发另一个更新。请参考elm-lang教程。
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?
注意:我认识到有一种更简单的方法来进行这种更改,但我正在尝试更深入地了解 Elm。
Msg
转换为Cmd Msg
?如果需要,我该如何转换? - steelCmd
将会导致 Elm 架构生命周期的另一个循环,所以如果只是为了触发另一个 Msg,你实际上只是浪费了额外的 CPU 循环。可能有一些原因想要强制进行另一个事件循环(比如动画或其他视图更新,但即使这些也需要额外的代码)。在我看来,大多数情况下,强制执行不必要的Cmd
感觉就像是忽略了update
函数作为函数的本质,并且误解了事件循环。 - Chad GilbertMsg
的结果都可以使用。例如:Cmd.map (always (SomethingElse param1 param2)) Cmd.none
。 - Chad Gilbert