gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:36:33 24 4
gpt4 key购买 nike

我有一个小型工作 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com