当elm-make
成功时,我在浏览器中收到以下错误:
无法阅读财产' kids'未定义的
我认为这是因为我对信号有循环依赖性:
model -> clicks -> model
以下是相关代码:
model : Signal Model
model =
Signal.foldp update initialModel clicks
clicks : Signal Action
clicks =
let
clickPosition = Mouse.position
|> Signal.sampleOn Mouse.clicks
tuplesSignal = Signal.map3 (,,) clickPosition Window.dimensions model
in
...
感觉model
被实现为榆树中的常见做法,所以我应该挑战clicks -> model
依赖。
以下是一些背景信息:
我正在使用画布构建滑动益智游戏:
当用户点击可以移动的磁贴时,它应该移动。否则,应忽略点击。
clicks
将产生以下操作:Left
,Right
,Up
,Down
例如,如果用户点击了图块12,11,8,15(按此顺序),则clicks
应为:Down -> Right -> Up
问题是,为了计算点击了哪个图块,我需要知道电路板尺寸(例如上图中的4行和4列)。但是,电路板尺寸存储在model
中(想象用户界面允许用户更改电路板尺寸)。
如何摆脱这种循环依赖?
答案 0 :(得分:3)
在这种情况下,我认为你应该在你所谓的输入中更低级别,并接受点击位置作为输入。然后,您可以在update
中构建Signal.foldp
函数中的两个:
Maybe Direction
(假设Left
,Right
,Up
,Down
是{{1}类型的构造函数}})Direction
值和模型来计算新模型。您可以使用Direction
和Maybe.map
来处理第一个函数结果的Maybe.withDefault
部分。 将这两个部分分开,即使您立即生成并使用Maybe
,也会使您的系统更加自我记录,并显示原始输入和受限制的“实际”输入之间的概念分割。
P.S。 Elm语言有conceivable extensions,可以让你更容易地在信号域中编写这个输入预处理。但是这样的扩展会使语言中的信号部分变得更加强大,以至于不清楚它是否会使编程程序更难以发现的“正确方法”。