Dmi*_*tsa 3 io monads haskell sdl sdl-2
我有一个小的工作SDL2示例(C++教程的简单端口),我正在尝试使用( - >)r monad重构渲染代码.这是没有重构的样本的工作部分
renderClear renderer
renderCopy renderer texture nullPtr nullPtr
renderPresent renderer
Run Code Online (Sandbox Code Playgroud)
制作和运行 - 纹理就在那里.都
renderClear renderer
flip ($) renderer $ do
copy texture nullPtr nullPtr
renderPresent renderer
Run Code Online (Sandbox Code Playgroud)
和
renderClear renderer
renderCopy renderer texture nullPtr nullPtr
flip ($) renderer $ do
present
Run Code Online (Sandbox Code Playgroud)
工作也很好.然而
renderClear renderer
flip ($) renderer $ do
copy texture nullPtr nullPtr
present
Run Code Online (Sandbox Code Playgroud)
只是绘制黑色窗口就是这样.present是的别名renderPresent和copy是renderCopy与第一个参数转移到结束.这与使用IO的这些功能有关吗?我怎样才能解决这个问题?
当你把它组合成
flip ($) renderer $ do
copy texture nullPtr nullPtr
present
Run Code Online (Sandbox Code Playgroud)
整个do块都在(->) rmonad中,所以这些动作不会被IO你拥有的任何潜在的monad 排序,而是基本上使用
(f >> g) x = g x
Run Code Online (Sandbox Code Playgroud)
只留下present组合.
我认为,解决这个问题的方法是使用ReaderTmonad变换器,它知道如何在排序时使用底层monad,将其变成类似的东西(你需要重新定义copy并present适当)
flip runReaderT renderer $ do
copy texture nullPtr nullPtr
present
Run Code Online (Sandbox Code Playgroud)