haskell - 无法让 (->) r monad 与 SDL2 渲染一起工作

标签 haskell io sdl monads sdl-2

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

renderClear renderer
renderCopy renderer texture nullPtr nullPtr
renderPresent renderer

制作并运行 - 纹理就在那里。两者

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 一起工作的功能有关吗?我该如何解决这个问题?

最佳答案

当你把它组合成

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

整个 do block 在 (->) r monad 中,因此操作不是由 IO 或任何底层的顺序你拥有的 monad,而不是本质上使用

(f >> g) x = g x

在组合中只留下 present

解决这个问题的方法,我认为,是使用 ReaderT monad transformer,它知道如何在排序时使用底层 monad,将它变成类似的东西(你需要重新定义 copypresent 适本地)

flip runReaderT renderer $ do
    copy texture nullPtr nullPtr
    present

关于haskell - 无法让 (->) r monad 与 SDL2 渲染一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26518969/

相关文章:

c++ - 在 SDL 中,SDL_Quit() 会释放每个表面吗?

haskell - 定义 Haskell 类型构造函数相等?

java - 无法读取带有地址的电子名片

haskell - 如何手动推断表达式的类型

android - 列出我的 Android App 打开的所有文件

java - 如何在 Java 中查找/列出目录及其子目录中具有特定名称的文件或目录?

ffmpeg - 如何让 SDL 播放 FLTP 样本(AAC)?

c++ - SDL 窗口在启动时关闭并返回 0

string - Haskell 语法,为假人解析错误

haskell - 数据映射 : how do I tell if I "need value-strict maps"?