无法使用( - >)r monad使用SDL2渲染

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是的别名renderPresentcopyrenderCopy与第一个参数转移到结束.这与使用IO的这些功能有关吗?我怎样才能解决这个问题?

Ørj*_*sen 5

当你把它组合成

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,将其变成类似的东西(你需要重新定义copypresent适当)

flip runReaderT renderer $ do
    copy texture nullPtr nullPtr
    present
Run Code Online (Sandbox Code Playgroud)