Statet y WX GUI Coexistance
-
19-09-2019 - |
Pregunta
El programa habitual de Wxhaskell se parece
main = do
run gui
gui = do
....
....
GUI debe tener tipo IO a
, ejecutar tiene tipo IO a -> IO ()
, también hay algunas rutinas de inicialización en run
.
Estoy tratando de hacer lo siguiente:
data AppGlobals = AG { ... some data ... }
type MApp a = StateT AppGlobals IO a
Pero en este caso la GUI debe tener tipo gui :: MApp AppGlobals
. Debido a su tipo, se hace imposible usar la sintaxis de mónada IO habitual, quiero decir que tengo que usar liftIO
Cada vez que realizo la acción de IO.
¿Hay alguna posibilidad convincente de usar la mónada estatal en Wxhaskell? No es muy convincente pasar el estado a cada manejador de eventos manualmente.
Solución
Los programas WXHaskell que he leído y escrito simplemente lleven al estado a variables.
http://wxhaskell.sourceforge.net/doc/graphics-ui-wx-variable.html
Aquí hay una buena descripción: http://legacy.cs.uu.nl/daan/download/papers/wxhaskell.pdf
Y usan inicio en lugar de correr.
Otros consejos
Es posible en teoría, pero he encontrado que es engorroso en la práctica, como lo hiciste tú. Mi propio código wxhaskell generalmente se ve como lo describí en el artículo del blog referenciado:
http://wewantarock.wordpress.com/2010/01/11/custom-controls-in-wxhaskell-tart-3/
Puede usar las variables WXHaskell, como JA sugirió, para el mismo propósito, aunque prefiero el estilo más explícito que utilicé en el blog.