我剛剛開始試驗 monad 轉換器,所以我可能錯過了一些微不足道的東西。無論如何:我如何從 ST monad 內部列印?
示例代碼:我想創建幾乎和 C 一樣快的代碼,通過盡可能快地讀取和寫入記憶體,使用類似 C 的 for 回圈。我有一個STmonad 操作,它可以安全地改變我運行的未裝箱陣列runSTUArray。
我的問題是,如何IO在ST動作中使用動作?如果它是一個Statemonad 動作,我可以使用StateTTransformer 將IO動作提升到,但是如何為STmonad做到這一點?
示例:ST。-- 如何在 ST monad 中列印表單?
import Control.Monad.ST (ST)
import Data.Array.Base ( STUArray(STUArray), newArray, readArray, writeArray )
import Data.Array.ST (runSTUArray)
import Data.Array.Unboxed ( elems )
import Control.Monad (forM_)
test :: IO ()
test = print . elems $ runSTUArray action
where
action :: ST s (STUArray s Int Int)
action = do
arr <- newArray (1,10) 1
forM_ [3..10] $ \i -> do
-- liftIO . print $ "i is " show i. --- <--- How should I do this?
x1 <- readArray arr (i-1)
x2 <- readArray arr (i-2)
writeArray arr i (x1 x2)
return arr
示例:StateT, -- 這里可以print在 monad/ 中提升使用它
import Data.Array.IArray (listArray, (!), (//), elems)
import Data.Array (Array)
import Control.Monad.Trans.State.Strict (StateT (runStateT), get, put)
import Control.Monad.IO.Class (MonadIO(liftIO))
import Control.Monad (forM_)
test :: IO ()
test = do
let n = listArray (1,10) [1..] :: Array Int Int
(_,x) <- runStateT action n
print $ elems x
return ()
where action = do
forM_ [3..10] $ \i -> do
x <- get
liftIO . print $ "i is " show i. -- <--- here printing works fine
put (x // [(i, x!(i-1) x!(i-2))])
uj5u.com熱心網友回復:
您不是從ST動作中列印,而是從IO動作中列印。幸運的是,還有IOUArray小號-他們甚至STUArray?引擎蓋下,所以就沒有害怕失去的性能。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/389036.html
