爲什麼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. jQuery的檢查返回undefined
- 7. 函數參數返回undefined
- 8. Haskell查找表返回函數
- 9. 函數返回值返回undefined
- 10. 函數的返回值返回undefined
- 11. 函數返回值返回爲undefined
- 12. javascript函數返回undefined
- 13. 調用函數返回'undefined'
- 14. Javascript函數返回爲undefined
- 15. 函數返回`undefined` 10
- 16. NodeJS/Javascript函數返回undefined
- 17. 遞歸函數返回undefined
- 18. d3.json()函數返回undefined
- 19. Javascript函數返回undefined
- 20. bitly函數返回undefined
- 21. Node.js函數返回'undefined'
- 22. Javascript函數返回undefined
- 23. 的onClick函數返回undefined
- 24. Javascript函數返回undefined
- 25. 函數對象返回undefined
- 26. ajax函數返回undefined
- 27. Javascript函數返回undefined
- 28. jQuery函數返回undefined
- 29. Js函數返回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' –