无法获得( - >)r monad与SDL2渲染一起使用

时间:2014-10-22 23:39:13

标签: haskell io sdl monads sdl-2

我有一个小的工作SDL2示例(C ++教程的直接端口),我正在尝试使用( - >)r monad重构渲染代码。这是没有重构的样本的工作部分

renderClear renderer
renderCopy renderer texture nullPtr nullPtr
renderPresent renderer

Make&跑 - 纹理就在那里。两个

renderClear renderer
flip ($) renderer $ do
    copy texture nullPtr nullPtr
renderPresent renderer

renderClear renderer
renderCopy renderer texture nullPtr nullPtr
flip ($) renderer $ do
    present

工作也很好。然而

renderClear renderer
flip ($) renderer $ do
    copy texture nullPtr nullPtr
    present

只是绘制黑色窗口即可。 presentrenderPresent的别名,copyrenderCopy,第一个参数转移到结尾。这与使用IO的这些功能有关吗?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:5)

将它合并到

flip ($) renderer $ do
    copy texture nullPtr nullPtr
    present

整个do块位于(->) r monad中,因此操作不会由IO或任何基础monad排序,而是基本上使用

(f >> g) x = g x

只留下present组合。

我认为解决这个问题的方法是使用ReaderT monad变换器,它知道如何在排序时使用底层monad,将其变成类似的东西(你需要重新定义{{1} }和copy适当的)

present