提前,抱歉这篇长篇文章.
我正在Haskell中编写一个事件驱动的应用程序,因此我需要存储几个回调函数以供进一步使用.我希望这样的回调是:
ReaderT,ErrorT,StateT而非裸IO秒;(MonadIO m, MonadReader MyContext m, MonadState MyState m, MonadError MyError m) => m (),而不是ReaderT MyContext (StateT MyState (ErrorT MyError IO))) 为简单起见,让我们忘记State和Error层.
我开始写一个存储在里面的所有回调的记录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 …
假设您有以下代码:
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 _attribute2的class A并忘记更新该serialize函数,这会导致运行时出现错误.(已经去过那里?)
有没有办法将此问题转化为编译时错误?由于C++不支持反射,我觉得这是不可能的,但我可能会遗漏一些东西.