这种类型IO a -> Arrow a没有意义; Arrow是一个类型类,而不是特定类型,非常像Monad或Num.具体来说,一个实例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)