无法阅读财产' kids'未定义 - 或如何打破榆树中信号的循环依赖?

时间:2015-11-04 12:05:56

标签: elm elm-signal

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依赖。

以下是一些背景信息:

我正在使用画布构建滑动益智游戏:

enter image description here

当用户点击可以移动的磁贴时,它应该移动。否则,应忽略点击。

clicks将产生以下操作:LeftRightUpDown

例如,如果用户点击了图块12,11,8,15(按此顺序),则clicks应为:Down -> Right -> Up

问题是,为了计算点击了哪个图块,我需要知道电路板尺寸(例如上图中的4行和4列)。但是,电路板尺寸存储在model中(想象用户界面允许用户更改电路板尺寸)。

如何摆脱这种循环依赖?

1 个答案:

答案 0 :(得分:3)

在这种情况下,我认为你应该在你所谓的输入中更低级别,并接受点击位置作为输入。然后,您可以在update中构建Signal.foldp函数中的两个:

  1. 第一个将点击和模型转换为Maybe Direction(假设LeftRightUpDown是{{1}类型的构造函数}})
  2. 第二个函数,它采用Direction值和模型来计算新模型。您可以使用DirectionMaybe.map来处理第一个函数结果的Maybe.withDefault部分。
  3. 将这两个部分分开,即使您立即生成并使用Maybe,也会使您的系统更加自我记录,并显示原始输入和受限制的“实际”输入之间的概念分割。

    P.S。 Elm语言有conceivable extensions,可以让你更容易地在信号域中编写这个输入预处理。但是这样的扩展会使语言中的信号部分变得更加强大,以至于不清楚它是否会使编程程序更难以发现的“正确方法”。