Haskell 如何知道是什么导致行为改变?

Haskell 如何知道是什么导致行为改变?,haskell,frp,reactive-banana,Haskell,Frp,Reactive Banana,我正在为一个列表框逻辑写一个网络描述。 其实很简单:我有一个可能是当前选定项的行为,我希望这样,每当用户向列表中添加新项时,当前选定项都会选择刚刚创建的值 用户还可以从列表中删除项目,并导致其他各种更改,因此我必须知道何时创建新项目;我不能每次更改都选择最后一项 我真的没有任何代码可以展示,因为我对该做什么的所有推测都不能用API*编写,但我有框架t和简化的上下文: bDb :: Behavior t [Entry] -- Created with accumB. bSelected :: Be

我正在为一个列表框逻辑写一个网络描述。 其实很简单:我有一个可能是当前选定项的行为,我希望这样,每当用户向列表中添加新项时,当前选定项都会选择刚刚创建的值

用户还可以从列表中删除项目,并导致其他各种更改,因此我必须知道何时创建新项目;我不能每次更改都选择最后一项

我真的没有任何代码可以展示,因为我对该做什么的所有推测都不能用API*编写,但我有框架t和简化的上下文:

bDb :: Behavior t [Entry] -- Created with accumB.
bSelected :: Behavior t (Maybe Entry) -- Created with accumB.
eAddEntry :: Event t () -- User clicked an add button. Created with fromAddHandler.
*嗯,我确实考虑过使用eAddEntry来选择最后一个条目,但这太糟糕了,即使它可以工作,也只是添加新条目和选择条目之间的一场竞赛


<>我怎么能在评论中给出仙人掌的建议,结果证明它是不可能完成的。我必须在选择行为的中间部分和列表行为之间进行绑定,但是它们之间是相互依存的。

因此,我决定从头开始,但这次又重新开始,并将整个状态封装在它自己的数据类型中,网络将仅驱动该数据类型。所以实际上,网络所要做的就是根据事件调用网络上的函数,就是这样。事实证明,它比imo优越得多,因为没有应用风格的混乱,所有的功能实际上都只是简单的功能,而且它更模块化,例如,我可以决定根本不使用FRP,而且变化非常小-只需将点火与功能切换;虽然我仍然需要找到把国家放在哪里,这很可能是像IORef这样不纯洁的东西

它很干净,看起来像这样:

data DbState = DbState Database SelectedItem LastAction Etc Etc
emptyState :: DbState
stateRemove, stateAdd :: DbState -> DbState
这种行为只是:

let bDb = accumB emptyState $ unions
      [stateAdd <$ eAddEntry
      ,stateRemove <$ eRemoveEntry
      ]
在此之前,我的长线上满是lambdas等

现在,我只是通过最后一个动作来调整并看到变化。
我还添加了非常简单的错误检查。

您能简单地将[Entry]与accumB中的其他内容相乘,告诉您上次更改的来源吗?因此,您将得到[Entry],ReasonItChanged和一些适当的数据类型数据ReasonItChanged=UserAdded | UserRemoved。@Cactus Err。。我真的想避免增加复杂性,但如果FRP/活性香蕉没有更好的方法,我会求助于。不过我还是要试试。非常感谢。你看过这个例子了吗?它处理类似的情况。其思想是,当前选定的项目来自两个来源:用户在列表框中单击,以及程序中的更改。最简单的方法是将后者视为建议,但前者是确定的。