Haskell STM检查函数返回未定义
Haskell STM检查函数返回未定义,haskell,ghc,stm,Haskell,Ghc,Stm,Contol.Concurent.STM库中的check函数具有类型Bool->STM a并在成功时返回undefined,而不是具有类型Bool->STM()?类型检查器的实现方式是编译一个do块,以check foo结尾,但在运行时失败,出现***异常:Prelude.undefined它看起来像是a的占位符定义,就像“定义”seq y=y被编译器替换为实际的原语实现代码。获取表达式并将其添加到不变量的全局列表中,如中所述 下面是一个从那篇文章中修改的超级做作的例子,以适应新类型的检查: i
Contol.Concurent.STM
库中的check
函数具有类型Bool->STM a
并在成功时返回undefined
,而不是具有类型Bool->STM()
?类型检查器的实现方式是编译一个do块,以check foo
结尾,但在运行时失败,出现***异常:Prelude.undefined
它看起来像是a的占位符定义,就像“定义”seq y=y
被编译器替换为实际的原语实现代码。获取表达式并将其添加到不变量的全局列表中,如中所述
下面是一个从那篇文章中修改的超级做作的例子,以适应新类型的检查
:
import Control.Concurrent.STM
data LimitedTVar = LTVar { tvar :: TVar Int
, limit :: Int
}
newLimitedTVar :: Int -> STM LimitedTVar
newLimitedTVar lim = do
tv <- newTVar 0
return $ LTVar tv lim
incrLimitedTVar :: LimitedTVar -> STM ()
incrLimitedTVar (LTVar tv lim) = do
val <- readTVar $ tv
let val' = val + 1
check (val' <= lim)
writeTVar tv val'
test :: STM ()
test = do
ltv <- newLimitedTVar 2
incrLimitedTVar ltv -- should work
incrLimitedTVar ltv -- should work still
incrLimitedTVar ltv -- should fail; we broke the invariant
import Control.Concurrent.STM
data LimitedTVar=LTVar{tvar::tvar Int
,limit::Int
}
newLimitedTVar::Int->STM LimitedTVar
newLimitedTVar lim=do
电视扫描隧道显微镜()
增量变量(LTVar tv lim)=do
这是一个好问题;中描述的检查现在似乎被称为AlwaysAccess
。我不清楚当前的检查是做什么的。是的,我不知道这样做的目的是什么。现在有点奇怪。check b=if b然后返回undefined else retry
我声称它应该是check b=if b然后返回()else retry
我理解检查的工作原理。我不明白为什么它的编写方式是,check True>=writeTVar t
将通过类型检查,但会导致运行时错误。我断言上面的代码应该不会通过类型检查,除非t
是非常无用的类型TVar()
。啊,我认为问题更多的是“如果这就是所有的代码,有什么意义?”我同意类型应该是Bool->STM()
。