Elm 如何";生成";在简单应用程序中使用自己的命令

Elm 如何";生成";在简单应用程序中使用自己的命令,elm,Elm,作为elm的学习示例,我想用elm架构创建一个简单的蛇游戏 以下是到目前为止的完整代码: 程序的一部分是一条UpdateWorld消息,该消息通过点击按钮和UpdateWorld函数生成,当用户按下空格键时调用该函数 这将导致以下编译和工作代码(代码片段构成完整代码): 在这些代码片段中,很明显,onClick事件会生成UpdateWorld命令。 但是在handleInput函数中,我必须“手动”调用updateWorld函数 我宁愿从我的handleInput函数“生成”一个新的Updat

作为elm的学习示例,我想用elm架构创建一个简单的蛇游戏

以下是到目前为止的完整代码:

程序的一部分是一条
UpdateWorld
消息,该消息通过点击按钮和
UpdateWorld
函数生成,当用户按下空格键时调用该函数

这将导致以下编译和工作代码(代码片段构成完整代码):

在这些代码片段中,很明显,
onClick
事件会生成
UpdateWorld
命令。 但是在
handleInput
函数中,我必须“手动”调用
updateWorld
函数

我宁愿从我的
handleInput
函数“生成”一个新的
UpdateWorld
命令。我认为这将澄清代码。比如:

handleInput keyCode =
    case Char.fromCode keyCode of
        ' ' ->
            -- how can I generate this command in my code
            UpdateWorld
我怎么能这样做


这是一个好主意,还是更好的模式?

回想一下,
update
只是一个函数,这意味着您可以递归调用它

考虑更改
handleInput
的签名,以同时返回
(Model,Cmd Msg)
,就像
更新
功能一样:

handleInput:Int->Model->(Model,Cmd-Msg)
HandleInputKeyCode模型=
case Char.fromCode keyCode of
' ' ->
更新World模型
“a”->
{model | snake=changeSnakeDirection model.snake West}![]
...
您可以去掉
updateWorld
函数,并将该代码移动到
updateWorld
消息处理程序:

update:Msg->Model->(Model,Cmd-Msg)
更新msg模型=
味精案例
更新世界->
({model | snake=updateSnake model.snake},Cmd.none)
更改方向新建方向->
({model | snake=changeSnakeDirection model.snake newDirection},Cmd.none)
按键键代码->
HandleInputKeyCode模型

谢谢,这正好解决了我的问题。我找错角落了,我得把录取标志拿走。在进一步思考这个问题后,我仍然对原来的问题感兴趣……我无意中得到了你的答案:。这似乎和我的问题一样?!是的,正如该答案中所解释的,虽然可以为特定的
Msg
触发另一个
Cmd
,但您可以/应该坚持递归调用
update
,除非您有明确的理由想要经历另一个Elm体系结构事件周期。
handleInput keyCode =
    case Char.fromCode keyCode of
        ' ' ->
            -- how can I generate this command in my code
            UpdateWorld