小编kor*_*ral的帖子

在Haskell中存储多态回调

提前,抱歉这篇长篇文章.

我正在Haskell中编写一个事件驱动的应用程序,因此我需要存储几个回调函数以供进一步使用.我希望这样的回调是:

  • 富集:使用的ReaderT,ErrorT,StateT而非裸IO秒;
  • 多态的:类型(MonadIO m, MonadReader MyContext m, MonadState MyState m, MonadError MyError m) => m (),而不是ReaderT MyContext (StateT MyState (ErrorT MyError IO)))

为简单起见,让我们忘记StateError层.

我开始写一个存储在里面的所有回调的记录MyContext,例如:

    data MyContext = MyContext { _callbacks :: Callbacks {- etc -} }

    -- In this example, 2 callbacks only
    data Callbacks = Callbacks {
        _callback1 :: IORef (m ()),
        _callback2 :: IORef (m ())}
Run Code Online (Sandbox Code Playgroud)

主要问题是:在哪里放置类型类约束m …

polymorphism monads haskell callback

10
推荐指数
1
解决办法
549
查看次数

如何设计一个可序列化的类,以便任何非序列化的属性导致编译时错误?

假设您有以下代码:

class A {
  bool _attribute1;
};

// Arbitrarily using std::string, not the point of this question
std::string serialize(const A&);
Run Code Online (Sandbox Code Playgroud)

现在,开发人员添加了一个新bool _attribute2class A并忘记更新该serialize函数,这会导致运行时出现错误.(已经去过那里?)

有没有办法将此问题转化为编译时错误?由于C++不支持反射,我觉得这是不可能的,但我可能会遗漏一些东西.

c++ serialization type-safety

6
推荐指数
1
解决办法
110
查看次数