TVar 构造函数?我无法获得 TVar
TVar constructor? I can't get a TVar
我是 haskell 和 stm 的新手,我想做一个简单的 rwlock。首先,我创建了 4 个主要函数(wlock、wunlock、rlock、runlock),需要 2 个 TVar Integeres:读取线程和写入线程的数量。
此时我无法按预期使用它。我试着这样编译
v1 <- atomically(newTVar 0);
v2 <- atomically(newTVar 0);
wlock v1 v2 -- wlock :: TVar Integer -> TVar Integer -> IO ()
wich 当然是丑陋的,但它有效(不知道为什么因为原子 returns IO (TVar a)
而不是 TVar a
)
我想要的:
我试图通过隐藏值来改善它。我在某处读到 monads 可能是要走的路,但我还没有研究过它们。相反,我尝试创建一个新类型 Rwlock as
data Rwlock = Rwlock { readCant :: TVar Integer
,writeCant :: TVar Integer
}
和一个构造函数,所以我可以做这样的事情:
import Rwlock
do{
a = rwconst;
forkIO(reader a);
forkIO(writer a);
}
其中 reader 将调用 rlock a
,而作者 wlock a
.
问题:
我无法创建构造函数。这是我尝试的(忽略 maxLectores
)
(A):
rwconst :: Integer -> Rwlock
rwconst n = Rwlock {readCant = TVar 0, writeCant = TVar 0, maxLectores = n}
{-rwconst n = Rwlock {readCant = atomically(newTVar 0), writeCant = atomically(newTVar 0), maxLectores = n}-}
但是没有导出 TVar 构造函数,也没有 returns TVar。我不知道为什么当我执行 wlock v1 v2
时第一段代码可以工作,但这样就不行了。
和(乙):
rwconst :: Integer -> Rwlock
rwconst n = do
a <- (atomically(newTVar 0));
Rwlock {readCant = a, writeCant = a, maxLectores = n}
这里Rwlock没有问题,但是do语句returns IO(),而不是我想要的Rwlock,我找不到怎么做:(
有谁能告诉我方法吗?提前致谢。
分配锁需要执行 IO,您无法绕过它。因此,请在您的操作类型中承认它:
rwconst :: Integer -> IO Rwlock
rwcost n = do
rcount <- newTVarIO 0
wcount <- newTVarIO 0
return Rwlock { readCant = rcount, writeCant = wcount, maxLectores = n }
然后,在main
中,你可以这样写:
main = do
a <- rwconst 10
forkIO (reader a)
forkIO (writer a)
-- and you should do something to wait for reader and writer to finish
我是 haskell 和 stm 的新手,我想做一个简单的 rwlock。首先,我创建了 4 个主要函数(wlock、wunlock、rlock、runlock),需要 2 个 TVar Integeres:读取线程和写入线程的数量。
此时我无法按预期使用它。我试着这样编译
v1 <- atomically(newTVar 0);
v2 <- atomically(newTVar 0);
wlock v1 v2 -- wlock :: TVar Integer -> TVar Integer -> IO ()
wich 当然是丑陋的,但它有效(不知道为什么因为原子 returns IO (TVar a)
而不是 TVar a
)
我想要的:
我试图通过隐藏值来改善它。我在某处读到 monads 可能是要走的路,但我还没有研究过它们。相反,我尝试创建一个新类型 Rwlock as
data Rwlock = Rwlock { readCant :: TVar Integer
,writeCant :: TVar Integer
}
和一个构造函数,所以我可以做这样的事情:
import Rwlock
do{
a = rwconst;
forkIO(reader a);
forkIO(writer a);
}
其中 reader 将调用 rlock a
,而作者 wlock a
.
问题:
我无法创建构造函数。这是我尝试的(忽略 maxLectores
)
(A):
rwconst :: Integer -> Rwlock
rwconst n = Rwlock {readCant = TVar 0, writeCant = TVar 0, maxLectores = n}
{-rwconst n = Rwlock {readCant = atomically(newTVar 0), writeCant = atomically(newTVar 0), maxLectores = n}-}
但是没有导出 TVar 构造函数,也没有 returns TVar。我不知道为什么当我执行 wlock v1 v2
时第一段代码可以工作,但这样就不行了。
和(乙):
rwconst :: Integer -> Rwlock
rwconst n = do
a <- (atomically(newTVar 0));
Rwlock {readCant = a, writeCant = a, maxLectores = n}
这里Rwlock没有问题,但是do语句returns IO(),而不是我想要的Rwlock,我找不到怎么做:(
有谁能告诉我方法吗?提前致谢。
分配锁需要执行 IO,您无法绕过它。因此,请在您的操作类型中承认它:
rwconst :: Integer -> IO Rwlock
rwcost n = do
rcount <- newTVarIO 0
wcount <- newTVarIO 0
return Rwlock { readCant = rcount, writeCant = wcount, maxLectores = n }
然后,在main
中,你可以这样写:
main = do
a <- rwconst 10
forkIO (reader a)
forkIO (writer a)
-- and you should do something to wait for reader and writer to finish