我的程序有一个客户端和一个需要通信的服务器组件。他们每个人都有一个变异的状态。 突变以下列方式明确完成:
有关系
class Diff a b where
commit :: a -> b -> a
这表示类型b
可以被认为是一个''类型a
,您可以修改a
类型的对象,提交'类型为b
的对象。
因此,您修改状态,这些块会被记录并传输到客户端,该客户端也具有上述关系的实例,仅适用于不同的类型a
。
现在,这是这笔交易。我的服务器状态是一个包含许多字段的记录。所有这些都可以改变,因为,你知道,它是一个国家。这就是它的作用。这让我不得不在我的' chunk中写一个单独的案例。为每个可能的字段键入,以便我可以通过网络传输它们。如果我可以以某种方式传输任何state -> state
函数,那将是可爱的,但我不会发现这种情况。客户端共享服务器代码,因此它 知道我的块的结构,以及它必须解释它们以更新它自己的部分,本地,国家是我可以管理的。
我想知道的是,如果我可以在这里使用镜头来自动生成更新块。我所有的' chunk'毕竟,type是一个笨拙的setter,具有我可以序列化的通用结构。
避免重复代码的最佳方法是什么?
为了让您更好地了解我的代码目前的外观,以下是服务器状态如何寻找乒乓球游戏的示例。
data State = State
{ playerPaddle :: Double
, aiPaddle :: Double
, ball :: Vec2 Double
, ballV :: Vec2 Double } deriving Show
data Update = BallPos (Vec2 Double)
| BallVel (Vec2 Double)
| PlayerPos Double
| AIPos Double
instance Diff State Update where
commit s (BallPos p) = s { ball = p }
commit s (BallVel p) = s { ballV = p }
commit s (PlayerPos p) = s { playerPaddle = p }
commit s (AIPos p) = s { aiPaddle = p }