在箭头内调用IO Monad

Joh*_*ohn 6 opengl monads haskell arrows hxt

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

C. *_*ann 5

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

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

newtype IOSLA s a b = IOSLA { runIOSLA :: s -> a -> IO (s, [b]) }
Run Code Online (Sandbox Code Playgroud)

这是一些混合物IO,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)
Run Code Online (Sandbox Code Playgroud)