[英]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.