为什么Contol.Concurent.STM
函数库中的check
函数的类型为Bool -> STM a
并且成功返回undefined
而不是类型Bool -> STM()
有充分的理由吗?事情是这样实现的类型检查器政体编译DO块与check foo
结束只有在运行时用*** Exception: Prelude.undefined
失败。Haskell STM检查函数返回undefined
回答
它看起来像是一个GHC PrimOp的占位符定义,就像编译器用实际原始实现代码替换的“定义”seq _ y = y
一样。 PrimOp implementation of check
接受一个表达式并将其添加到STM invariants paper中描述的全局不变量列表中。
下面是该文件修改的超人为的例子,以适应新类型的check
:
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
现实,这将是断言共享状态不变有用的,失败的断言可能是一个迹象暂时的不一致。那么你可能要与不变成为实现再最终的期望,重试,但由于这个例子卷起永久打破不变的,它只是调用retry
永远似乎挂起。查阅这篇论文可以找到更好的例子,但请记住,该类型自发布以来已经发生了变化。
我了解如何检查工作。我不明白为什么它会以'check True >> = writeTVar t'这样的方式写入,通过类型检查,但会导致运行时错误。我声称上面的代码应该会失败,除非't'是相当无用的类型'TVar()'。 –
啊,我想这个问题更多的是朝着这个方向发展,“如果这是所有的代码,那有什么意义?”我同意这种类型应该是'Bool - > STM()'。 – acfoltzer
- 1. 返回函数返回'undefined'
- 2. 函数返回'undefined'
- 3. 函数返回undefined
- 4. 函数返回undefined
- 5. 函数参数返回undefined
- 6. Haskell查找表返回函数
- 7. 函数的返回值返回undefined
- 8. 函数返回值返回undefined
- 9. 函数不断返回undefined
- 10. Javascript函数返回为undefined
- 11. Javascript函数返回undefined
- 12. 函数返回`undefined` 10
- 13. 返回“undefined”的JavaScript函数
- 14. 的onClick函数返回undefined
- 15. JavaScript函数返回undefined
- 16. d3.json()函数返回undefined
- 17. 函数返回undefined AngularJS
- 18. Node.js函数返回'undefined'
- 19. 递归函数返回undefined
- 20. Javascript函数返回undefined
- 21. NodeJS/Javascript函数返回undefined
- 22. ajax函数返回undefined
- 23. 验证函数返回undefined错误检查而不是真
- 24. Javascript函数返回undefined从mongodb函数
- 25. jQuery表单验证检查返回'undefined'
- 26. 量角器函数返回undefined?
- 27. Ajax,JS函数返回undefined值
- 28. Javascript base64编码函数返回undefined
- 29. 从函数返回'undefined'变量
- 30. 已解决:Javascript函数返回undefined?
这是一个很好的问题;这似乎是在[STM不变量纸]所述的'check'(http://research.microsoft.com/en-us/um/people/simonpj/papers/stm/stm-invariants.pdf)现在称为' alwaysSucceeds'。我不清楚目前的“检查”功能。 – acfoltzer
是的,我不知道这样做的目的可能是什么。有点好奇。 –
'检查B =若B则返回undefined别的retry'我要求它应该读作检查B =若B则返回()其他retry' –