序列化Setter

时间:2015-01-19 18:09:52

标签: haskell serialization lens

我的程序有一个客户端和一个需要通信的服务器组件。他们每个人都有一个变异的状态。 突变以下列方式明确完成:

有关系

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 }

0 个答案:

没有答案