Functional programming 如何通过函数式编程“跟踪”用户活动?

Functional programming 如何通过函数式编程“跟踪”用户活动?,functional-programming,Functional Programming,tl;博士 在一个在每个帧上调用函数onEnterFrame的程序中,如何存储和改变状态?例如,如果您正在制作一个关卡编辑器或一个绘图程序,其中跟踪状态并进行小的增量更改是很诱人的。在全局状态变化最小的情况下,处理这种事情的最有效的方法是什么 长版本: 在接受用户输入的交互式程序中,如鼠标单击和按键,我们可能需要跟踪数据模型的状态。例如: 是否选择了某些元素? 鼠标光标是否悬停在某个元素上,哪个元素? 鼠标按钮按下多长时间?这是单击还是拖动? 我们有时还需要对大型模型进行小的更改: 在标高编辑器

tl;博士

在一个在每个帧上调用函数onEnterFrame的程序中,如何存储和改变状态?例如,如果您正在制作一个关卡编辑器或一个绘图程序,其中跟踪状态并进行小的增量更改是很诱人的。在全局状态变化最小的情况下,处理这种事情的最有效的方法是什么

长版本:

在接受用户输入的交互式程序中,如鼠标单击和按键,我们可能需要跟踪数据模型的状态。例如:

是否选择了某些元素? 鼠标光标是否悬停在某个元素上,哪个元素? 鼠标按钮按下多长时间?这是单击还是拖动? 我们有时还需要对大型模型进行小的更改:

在标高编辑器中,我们可能需要将一面墙添加到现有的一组大型预制件中。你不想重建这个场景,是吗? 到目前为止,阅读弗里斯比教授的《基本充分的指南》,有许多功能解决方案可以解决从输入源提取数据、对该数据执行计算并将结果传递给某些输出的问题

有时,应用程序让用户进行交互,并对数据执行一系列突变。例如,如果一个程序让用户像在画布上画画一样画画,我们需要存储画画的状态以及导致该状态的操作,以便进行撤销和记录/调试,该怎么办

什么状态是可接受的存储状态,我们应该绝对避免什么? 目前我的结论是,我们不应该存储我们只需要暂时的状态,我们应该将它直接传递给需要它的函数

但是,如果有几个函数需要特定的计算,该怎么办?就像我们检查鼠标光标是否悬停在特定区域上一样,我们为什么要重新计算它


有没有办法进一步减少全局状态的突变?

存储状态不是问题。问题在于全球状态的变化。有一些解决方案可以解决这个问题。一个浮现在脑海中的是。但是,我不确定这是否适合撤消操作。但这是一个开始

如果您只想将问题视为一个初始状态和一组操作,那么您可以将操作视为一个列表,可以遍历该列表,其中头部是最新的操作。撤销一组n个操作可以通过遍历列表的前n个元素并将这些操作的倒数传给列表来完成


这样,您根本不需要修改全局状态。

存储全局状态和变异全局状态之间的区别不清楚,因为如果您存储的是状态,您可能正在更新它?您是否建议,如果某个模型对某个主进程很重要,我应该将其注入处理该进程的函数中?状态monad将状态传递给每个“转换”,并返回一个新状态。这样,全球国家就不会发生变异。列表的使用是为了模拟事件存储,其中的状态是通过从操作序列上的初始状态“折叠”到某个最终状态而派生的。同样,不需要对全局状态进行变异。我意识到我的问题与这个问题的重复性很差:我建议阅读以下内容: