序列化Setter

Luk*_*vat 5 serialization haskell haskell-lens

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

有一种关系

class Diff a b where
    commit :: a -> b -> a
Run Code Online (Sandbox Code Playgroud)

这就是说类型b可以被认为是类型的"块" a,你可以a通过"提交" 类型的对象来修改类型的对象b.

因此,您修改状态,这些块被记录并传输到客户端,该客户端也具有上述关系的实例,仅用于不同类型a.

现在,这是交易.我的服务器状态是一个包含许多字段的记录.所有这些都可以改变,因为,你知道,这是一个国家.这就是它的作用.这使我不得不为每个可能的字段在我的"块"类型中编写一个单独的案例,以便我可以通过网络传输它们.如果我可以以某种方式传输任何state -> state功能,那将是可爱的,但我不认为这发生了.客户端共享服务器代码,因此它确实了解我的"块"的结构,并且它必须解释它们以更新它自己的本地状态的部分是我可以管理的.

我想知道的是,如果我可以在这里使用镜头来自动生成更新块.毕竟,我所有的'chunk'类型都是一个笨拙的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 }
Run Code Online (Sandbox Code Playgroud)