繁体   English   中英

状态Monad混合IO和非IO

[英]State Monad mix IO and non-IO

我尝试将State Monad用于简单变量,并且可以正常工作。 但是在这里,我似乎正在尝试混合使用IO和非IO。 由Monad州管理阵列的意图。 我想读写此数组。

似乎比我想的要难。

        funarray :: Map.Map String (IOArray Int Int)
        funarray = Map.empty

        storearray :: String ->  (IOArray Int Int)-> State (Map.Map String  (IOArray Int Int)) ()
        storearray x value = do
        funarray <- get
        put (Map.insert x value funarray)

        retrievearray :: String -> State (Map.Map String  (IOArray Int Int)) (Maybe ( (IOArray Int Int)))
        retrievearray arr = do
        funarray <- get
        return (Map.lookup arr funarray)

        putmutablearray = do {
                   arr <- newArray (512,512) 0 ;
                   storearray "value-table" arr
                 }
        getmutablearray = do { retrievearray "value-table";}

        putthenget = do {putmutablearray; getmutablearray;}

        value :: BoardState -> IO Int
        value  (BoardState xloc oloc index) = do {
          arr <- (runState putthenget funarray);
          v <- (readArray arr index);
          return v
        }

从此开始出现多个错误。

* Couldn't match expected type `IOArray Int Int'
              with actual type `IO (IOArray Int Int)'
* In the second argument of `storearray', namely `createarray'
  In a stmt of a 'do' block: storearray "value-table" createarray
  In the expression: do { storearray "value-table" createarray }

我可以混合吗?

这只是一个全局数组。 大一个。 我需要大型机器来完成机器学习任务。

更新:以命令式语言,我将其全局存储。

          createarray :: IO ( IOArray Int Int)
          createarray =  do {
                   arr <- newArray (512,512) 0;
                   return arr
              }

我自己的答案。 我认为这是惯用的Haskell答案。 其他专家可以认为。 虽然不确定如何使阵列全局访问。 有人告诉我那不是正确的Haskell。

   type ArrayAccess = ReaderT  (IOArray Int Int)  IO 
   type ArrayWriteAccess = ReaderT  (IOArray Int Int)  IO() 

   readvalue ::  Int -> ArrayAccess Int   
   readvalue x    = do 
   a <- ask
   b <- liftIO( readArray a x);    
   return b

   writevalue ::  Int -> Int -> ArrayWriteAccess   
   writevalue x y   = do 
   a <- ask
   liftIO( writeArray a x y)    

   -- Test array accesses
   readfromarray = do { a <- createarray; liftIO (runReaderT (readvalue 1) a) }
   writetoarray = do { a <- createarray; liftIO (runReaderT (writevalue 1 2) a) }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM