也許我錯了,但是我正在使用HXT來讀取我想在HOpenGL的一個數組中使用的頂點數據。頂點數組需要是通過調用newArray創建的Ptr。不幸的是,newArray會返回一個IO Ptr,所以我不知道如何在Arrow中使用它。我想我需要一個類似於IO的類型聲明 - > Arrow a?在一個箭頭內調用一個IO Monad
6
A
回答
5
類型IO a -> Arrow a
沒有意義; Arrow
是一個類型類,不是特定類型,很像Monad
或Num
。具體來說,Arrow
的一個實例是一個類型構造函數,它帶有兩個參數,它們描述了可以像函數一樣組成的東西,匹配類型端到端。所以,將IO a
轉換爲箭頭可能會被稱爲概念類型錯誤。
我不確定你想要做什麼,但是如果你真的想用IO
作爲Arrow
的一部分,你需要你的Arrow
實例包含它。最簡單的形式就是觀察到,對於任何Monad
實例,類型如a -> m b
的函數都可以用明顯的方式組成。所述hxt
包似乎提供了更復雜的類型:
newtype IOSLA s a b = IOSLA { runIOSLA :: s -> a -> IO (s, [b]) }
這是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)
相關問題
- 1. 如何在另一個Monad中使用IO Monad
- 2. 在IO monad中使用monad
- 3. 使一個小箭頭CSS
- 4. IO內部獲取Monad
- 5. 使用箭頭動畫一個e.Graphics.DrawLine
- 6. 在opengl中繪製一個箭頭ES
- 7. 在Pygame中繪製一個箭頭
- 8. 在面前添加一個箭頭
- 9. 在底部做一個箭頭
- 10. 在C中的一個Picturebox上繪製一個箭頭#
- 11. Android - 如何正確繪製一個帶箭頭的箭頭?
- 12. 我該如何實際執行一個StateT monad以及IO?
- 13. UINavigationItem:創建一個 「nextBarButtonItem」(= rightBarButtonItem箭頭)
- 14. 下載箭頭幫助 - 下載一個文件,並有一個箭頭點它在哪裏
- 15. 圖像導航覆蓋箭頭(下一個和前一個)
- 16. 修復箭頭(img)上一個和下一個
- 17. 如何製作一個:箭頭之後只是一個大綱?
- 18. Lightbox2 - 上一個和下一個箭頭沒有出現
- 19. 如何爲圖庫添加上一個和下一個箭頭?
- 20. 在懸停#leaderboard上,向#左箭頭和#右箭頭添加一個類
- 21. 短路和在IO Monad
- 22. Android微調器顯示一個箭頭和選擇圈?
- 23. 在這個箭頭調用中哪個令牌無效?
- 24. 在圖像的任一側放置下一個和上一個箭頭
- 25. HTML/CSS - 在DIV的一側創建一個「箭頭」
- 26. UITableView(在UIScrollView內)didSelectRowAtIndexPath:不在第一個水龍頭上調用
- 27. React/ES6 - 爲什麼在另一個函數中調用一個函數只適用於es6箭頭函數?
- 28. 語境VS瘦箭頭時調用的回調的另一個功能
- 29. 對一個錯誤monad證明了一些monad法我寫了
- 30. 如何使用箭頭鍵在GridWorld中移動一個Bug
['arrIO'](http://hackage.haskell.org/packages/archive/hxt/9.1.4/doc/html/ Control-Arrow-ArrowIO.html#v:arrIO)似乎是他正在尋找的人。它的實現與你的基本相同。 – hammar
@hammar:*阿哈!*謝謝,由於某種原因,我認爲它會在名稱中「提起」。 –
啊,是的,就是這樣!每當我想到我已經找到了箭和單子,我就會重新找出它們...... – John