C'è una buona ragione per cui la funzione check
nella libreria Contol.Concurent.STM
è di tipo Bool -> STM a
e restituisce undefined
in caso di successo piuttosto che avere il tipo Bool -> STM()
? Il modo in cui viene implementato il controllo di tipo comporrà un blocco do che termina con check foo
solo per fallire in fase di esecuzione con *** Exception: Prelude.undefined
.funzione di controllo Haskell STM restituisce undefined
risposta
Sembra che sia una definizione segnaposto per un GHC PrimOp, come la "definizione" seq _ y = y
che viene sostituito dal compilatore con il codice vero e primitivo implementazione. PrimOp implementation of check
prende un'espressione e la aggiunge a un elenco globale di invarianti come descritto in STM invariants paper.
Ecco un esempio di super-artificiosa modificata da quella carta in base al nuovo tipo di 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
Realisticamente, questo sarebbe utile per far valere invarianti sullo stato condiviso in cui in mancanza l'affermazione potrebbe essere un segno di un'incoerenza temporanea. Potresti quindi riprovare con l'aspettativa che l'invariante possa diventare di nuovo vero alla fine, ma poiché questo esempio finisce per rompere definitivamente l'invariante, chiama semplicemente retry
per sempre e sembra bloccarsi. Controlla la carta per esempi molto migliori, ma tieni presente che il tipo è cambiato dalla sua pubblicazione.
Capisco come funziona la verifica. Non capisco perché sia scritto in modo tale che 'check True >> = writeTVar t' passerà il controllo del tipo, ma causerà un errore di runtime. Asserisco che il codice sopra dovrebbe fallire nel controllo del tipo a meno che 't' sia il tipo piuttosto inutile' TVar() '. –
Ahhh, pensavo che la domanda fosse più nella direzione di "se questo è tutto il codice è, qual è il punto?" Sono d'accordo che sembra che il tipo dovrebbe essere 'Bool -> STM()'. – acfoltzer
- 1. jQuery casella di controllo sempre restituisce 'undefined'
- 2. In che modo Clojure STM differisce da Haskell STM?
- 3. Haskell, Canali, STM, -threaded, Message Passing
- 4. Perché Parse.Config restituisce undefined?
- 5. Funzione Haskell che restituisce il tipo esistenziale
- 6. $ stateParams restituisce undefined
- 7. Console restituisce il valore undefined
- 8. Accounts.createUser() restituisce undefined sul client
- 9. dati jQuery() restituisce undefined, attr() restituisce intero
- 10. Haskell: thread bloccato a tempo indeterminato in una transazione STM
- 11. Le scritture TChan sono integrate in Haskell STM?
- 12. Funzione di inversione Haskell
- 13. Socket.io 'on' si restituisce undefined
- 14. funzione restituisce
- 15. Funzione utf8_encode undefined
- 16. Utilizzo di transazioni STM e database insieme
- 17. Controllo Tipo Funzione a Scala
- 18. Dichiarazioni di controllo in Haskell?
- 19. Haskell - ha una funzione restituisce un carattere vuoto
- 20. Funzione di analisi in haskell
- 21. Haskell: funzione 'makeNtuple'?
- 22. Come implementare l'equivalente dell'istruzione select di Go per i canali Haskell STM?
- 23. Haskell e memoization della funzione puro risultati
- 24. window.open() restituisce undefined quando viene chiamato da setTimeout su Android
- 25. Applicazione funzione in Haskell
- 26. Funzione interazione Haskell
- 27. Funzione tokenizer stringa Haskell
- 28. funzione principale Haskell
- 29. funzione Haskell composizione domanda
- 30. GoogleMaps v3 autocomplete.getBounds() restituisce undefined dopo essere stato impostato
Questa è una buona domanda; sembra che il 'check' descritto nella [carta invarianti STM] (http://research.microsoft.com/en-us/um/people/simonpj/papers/stm/stm-invariants.pdf) sia ora chiamato' alwaysSucceeds'. Non mi è chiaro quale sia il "controllo" attuale. – acfoltzer
Sì, non ho idea di quale possa essere lo scopo di averlo. Un po 'curioso ora. –
'check b = se b poi restituisce undefined else retry' dichiaro che dovrebbe leggere' check b = if b then return() else retry' –