gpt4 book ai didi

opengl - 在 Arrow 内调用 IO Monad

转载 作者:行者123 更新时间:2023-12-02 06:59:54 24 4
gpt4 key购买 nike

也许我的处理方式是错误的,但我正在使用 HXT 读取一些我想在 HOpenGL 数组中使用的顶点数据。顶点数组需要是通过调用 newArray 创建的 Ptr。不幸的是 newArray 返回一个 IO Ptr,所以我不确定如何在 Arrow 中使用它。我想我需要类似 IO a -> Arrow a 的类型声明?

最佳答案

类型IO a -> Arrow a没有意义; Arrow 是一个类型类,而不是特定类型,很像 MonadNum。具体来说,Arrow 的实例是一个类型构造函数,它采用两个参数来描述可以像函数一样组合的事物,并端到端匹配类型。因此,将 IO a 转换为箭头也许可以称为概念类型错误。

我不确定你到底想做什么,但如果你真的想使用IO操作作为Arrow的一部分,你需要你的Arrow 实例来包含它。最简单的形式是观察任何 Monad 实例的具有类似 a -> m b 类型的函数可以以明显的方式组合。 hxt 包似乎提供了更复杂的类型:

newtype IOSLA s a b = IOSLA { runIOSLA :: s -> a -> IO (s, [b]) }

这是 IOState[] monad 的某种混合,附加到上述函数,以便您可以编写他们在每一步都会经历所有三个 Monad。我并没有真正使用过很多 hxt,但是如果这些是您正在使用的 Arrow,那么提升任意 IO 就非常简单> 函数作为一个——只需将状态值s原封不动地传递过去,并将函数的输出转换为单例列表。可能已经有一个函数可以为您执行此操作,但我一眼就没有看到这个函数。

基本上,你想要这样的东西:

liftArrIO :: (a -> IO b) -> IOSLA s a b
liftArrIO f = IOSLA $ \s x -> fmap (\y -> (s, [y])) (f x)

关于opengl - 在 Arrow 内调用 IO Monad,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7250221/

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