2011-08-30 53 views
6

也許我錯了,但是我正在使用HXT來讀取我想在HOpenGL的一個數組中使用的頂點數據。頂點數組需要是通過調用newArray創建的Ptr。不幸的是,newArray會返回一個IO Ptr,所以我不知道如何在Arrow中使用它。我想我需要一個類似於IO的類型聲明 - > Arrow a?在一個箭頭內調用一個IO Monad

回答

5

類型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小號在每一步。我還沒有真正使用過hxt,但如果這些是你正在使用的Arrow,那麼解除任意IO函數作爲一個函數是相當簡單的 - 只需將狀態值s保持不變即可,然後將輸出的函數轉換爲單例列表。可能已經有一個功能爲你做這件事,但我沒有看到一個。

基本上,你想要的東西是這樣的:

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

['arrIO'](http://hackage.haskell.org/packages/archive/hxt/9.1.4/doc/html/ Control-Arrow-ArrowIO.html#v:arrIO)似乎是他正在尋找的人。它的實現與你的基本相同。 – hammar

+0

@hammar:*阿哈!*謝謝,由於某種原因,我認爲它會在名稱中「提起」。 –

+0

啊,是的,就是這樣!每當我想到我已經找到了箭和單子,我就會重新找出它們...... – John

相關問題