6

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

4

1 回答 1

5

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

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

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

这是, 和monad 的某种混合物IO,附加到上述函数,这样您就可以在每个步骤中通过所有三个 s 组合它们。我并没有真正使用太多,但是如果这些是您正在使用的 s,那么提升任意函数作为一个函数非常简单——只需将状态值不变地传递,并将函数的输出转换为单例列表。可能已经有一个功能可以为您执行此操作,但我一眼看不到。State[]MonadhxtArrowIOs

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

liftArrIO :: (a -> IO b) -> IOSLA s a b
liftArrIO f = IOSLA $ \s x -> fmap (\y -> (s, [y])) (f x)
于 2011-08-30T22:05:06.620 回答