我有一个小的工作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
只是绘制黑色窗口即可。 present
是renderPresent
的别名,copy
是renderCopy
,第一个参数转移到结尾。这与使用IO的这些功能有关吗?我该如何解决这个问题?
答案 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