也许我的做法是错误的,但我正在使用 HXT 读取一些我想在 HOpenGL 的数组中使用的顶点数据。顶点数组需要是通过调用 newArray 创建的 Ptr。不幸的是 newArray 返回一个 IO Ptr,所以我不确定如何在 Arrow 中使用它。我想我需要一个类型声明类似于 IO a -> Arrow a 的东西?
问问题
476 次
1 回答
5
类型IO a -> Arrow a
没有意义;Arrow
是一个类型类,而不是特定类型,很像Monad
or 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
[]
Monad
hxt
Arrow
IO
s
基本上,你会想要这样的东西:
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 回答