我对 Elm 比较陌生,并且被 Elm 处理 GUI 的方式深深吸引。但是经过深思熟虑后,我发现很难有效地仅更新列表或手指树中的一个元素(就像 Haskell 中的手指树,如果它已经存在于 Elm 的库中),它位于 Signal 下,并且它的大小也有所不同与时间抗衡。
具体来说,要表达一个动态的手指树,我们必须写
Signal [ {-手指树的元素类型-} ]
但是如果我们想有效地更新手指树的一个元素,我们必须写
Signal [ Signal {-核心数据类型-} ]
但是在 Elm 中 Signal 不是 Monad,那么如何将两层 Signals 扁平化为一层呢?
评论 1:我不详细了解 Elm 在这种情况下的行为。重新处理整个手指树只是我的猜测。
注释 2:例如,假设我们有一个信号值,标记为s
,类型为Signal (fingerTree Int)
,以及以下函数,标记为f
,其输入为s
,例如,lift (fmap (+1))
其类型为Signal (fingerTree Int) -> Signal (fingerTree Int)
。如果s
只有一个元素发生了变化,函数f
必须对s
. 显然,这是在浪费时间,我不确定 Elm 是否足够聪明,可以检测到不可变性。