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()