¿Hay una buena razón por la cual la función check
en la biblioteca Contol.Concurent.STM
tiene tipo Bool -> STM a
y devuelve undefined
en caso de éxito en lugar de tener el tipo Bool -> STM()
? La forma en que se implementa el tipo checker compilará un bloque do que termina en check foo
solo para fallar en el tiempo de ejecución con *** Exception: Prelude.undefined
.función de comprobación de Haskell STM devolviendo undefined
Respuesta
Parece que es una definición de marcador de posición para GHC PrimOp, como la "definición" seq _ y = y
que se reemplaza por el compilador con el código de implementación primitivo real. El PrimOp implementation of check
toma una expresión y la agrega a una lista global de invariantes como se describe en el STM invariants paper.
Aquí está un ejemplo súper artificial modificado a partir de ese papel para adaptarlas al nuevo tipo de 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
realista, esto sería útil para afirmar invariantes en estado compartido en su defecto la afirmación podría ser una señal de una incoherencia temporal. Quizás desee volver a intentarlo con la expectativa de que ese invariante vuelva a ser cierto nuevamente con el tiempo, pero como este ejemplo termina rompiendo permanentemente el invariante, simplemente llama al retry
para siempre y parece colgarse. Consulte el documento para obtener ejemplos mucho mejores, pero tenga en cuenta que el tipo ha cambiado desde su publicación.
Entiendo cómo funciona el cheque. No entiendo por qué está escrito de tal manera que 'check True >> = writeTVar t' pasará la verificación de tipo, pero causará un error de tiempo de ejecución. Afirmo que el código anterior debe fallar verificación de tipo a menos que 't' es el tipo más bien inútil' TVar() '. –
Ahhh, pensé que la pregunta era más en la dirección de "si esto es todo el código, ¿cuál es el punto?" Estoy de acuerdo en que parece que el tipo debería ser 'Bool -> STM()'. – acfoltzer
- 1. ¿En qué se diferencia Clojure STM de Haskell STM?
- 2. Haskell: hilo bloqueado indefinidamente en una transacción STM
- 3. comprobación de tipos en función Scala
- 4. STM problema de mónada
- 5. Aplicación de función Haskell
- 6. Función de función de infijo Haskell precedencia
- 7. Haskell - Comprobación de la validez de un identificador de archivo
- 8. JavaScript: undefined! == undefined?
- 9. ¿Comprobación de rango en el caso de Haskell?
- 10. Utilizando STM y transacciones de base de datos juntas
- 11. Función de análisis en haskell
- 12. Backbone.js model.get() devolviendo 'undefined' aunque puedo ver los atributos en console.log
- 13. Haskell función composición
- 14. Devolviendo una enumeración de una función en C?
- 15. ¿Devolviendo nulo o nada de la función VBScript?
- 16. función Haskell composición pregunta
- 17. ¿Qué algoritmos se utilizan en Clojure, Haskell (y otros idiomas) para STM?
- 18. Una "verdadera" función genérica en Haskell
- 19. Cómo implementar esta función en Haskell
- 20. variable === undefined vs. typeof variable === "undefined"
- 21. Función Haskell para invertir la función llamada
- 22. Haskell forma de hacer la comprobación de errores de varios elementos con aborto
- 23. Usos para la función id de Haskell
- 24. Función de cola Haskell para listas vacías
- 25. ¿Cómo uso una función de biblioteca Haskell?
- 26. La función de Haskell no termina
- 27. Función polivalente de Haskell con IO
- 28. Escribir una función de tiempo en Haskell
- 29. Entender la función de enlace en Haskell
- 30. haskell - función de hiperoperación (ackermann), tetration
Esta es una buena pregunta; parece que el 'cheque 'descrito en el [documento de invariantes de STM] (http://research.microsoft.com/en-us/um/people/simonpj/papers/stm/stm-invariants.pdf) ahora se llama' alwaysSucceeds'. No está claro para mí lo que hace la 'verificación' actual. – acfoltzer
Sí, no tengo idea de cuál podría ser el propósito de tenerlo así. Un poco curioso ahora. –
'check b = if b then return undefined else retry' Reclamo que debería leer' check b = if b then return() else retry' –