首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Elm中传播点击信号以模拟更新?

如何在Elm中传播点击信号以模拟更新?
EN

Stack Overflow用户
提问于 2014-01-27 21:11:08
回答 1查看 232关注 0票数 1

我正在用榆树写一个游戏,在这个游戏中有一个按钮,当按下这个按钮时,棋盘就会重新设置到它的初始状态。然而,我不明白如何将按钮单击信号传播到板模型的更新功能中。在下面的代码中,我刚刚将单位值传递给了stepBoard,但是我不能用它做很多事情,所以我如何解决它呢?

代码语言:javascript
复制
--MODEL
type Board = [(Int,Int)]
type Game = {name: String, board: Board}
defaultGame = {name = "Test", board = [(3,3)]}

--UPDATE
stepBoard click (colsInit, rowsInit) (rows, cols) g = 
          {g | board <- if ? then --some initial value (colsInit, rowsInit)
                        else      --some updated value using (rows, cols)} 
stepGame: Input -> Game -> Game                                      
stepGame {click, name, rowsColsInit, rowsCols} g = stepBoard click (0,0) (0,0) g
game = foldp stepGame defaultGame input

--INPUT
type Input = {click:(), name: String, rowsColsInit: (Int,Int), rowsCols: (Int,Int)}
input = Input <~ clicks ~ nameSignal ~ rowsColsInitSignal ~ rowsColsSignal

--VIEW
(btn, clicks) = Input.button "Click"
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-02 15:34:25

结合foldp和单击信息可能是不直观的。

通常使用的解决方案是对不同可能的事件进行编码的ADT:

代码语言:javascript
复制
data Input = Init (Int, Int)
           | Update { name         : String
                    , rowsCols     : ( Int, Int )
                    }
input = merge (Init <~ (sampleOn clicks rowsColsInitSignal))
              (OtherInput <~ nameSignal ~ rowsColsSignal)

merge合并两个信号,always创建一个常量函数。

现在,您可以在您的更新函数中逐个匹配:

代码语言:javascript
复制
stepBoard input g = 
  let newBoard = 
        case input of
          Init (initRows, initCols) -> -- do your initialisation here
          Update {name, rowsCols}   -> -- do your update here
  in { g | board <- newBoard }
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21391751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档