2010-03-11 3 views
1

обычная программа wxHaskell выглядитStateT и WX гуй Сосуществование

main = do 
     run gui 

gui = do 
    .... 
    .... 

графический интерфейс должен иметь тип IO a, бег имеет тип IO a -> IO(), также есть некоторые процедуры инициализации в run.

Я Тринг сделать следующее:

data AppGlobals = AG { ... some data ... } 
type MApp a = StateT AppGlobals IO a 

Но в этом случае графического интерфейса должен иметь тип gui :: MApp AppGlobals. Из-за его типа становится невозможным использовать обычный синтаксис монады IO, я имею в виду, что я должен использовать liftIO каждый раз, когда выполняю операцию ввода-вывода.

Есть ли подходящая возможность использовать государственную монаду в wxHaskell? Невозможно передать состояние каждому обработчику событий вручную.

ответ

0

Программы wxHaskell, которые я прочитал и написал, просто перетаскивают состояние в переменные.
http://wxhaskell.sourceforge.net/doc/Graphics-UI-WX-Variable.html

Вот хороший обзор: http://legacy.cs.uu.nl/daan/download/papers/wxhaskell.pdf

И они используют, а не начать работать.

+0

В WX и WXCore есть два немного разных интерфейса. В WXCore используется 'run', тогда как в WX используется' start'. У них такой же тип. –

0

Это возможно в теории, но я обнаружил, что это на практике громоздко, как и вы. Мой собственный код wxHaskell обычно выглядит, как я описал в упомянутой статье блог:

http://wewantarock.wordpress.com/2010/01/11/custom-controls-in-wxhaskell-part-3/

Вы можете использовать переменные wxHaskell как JA предложил, для тех же целей, хотя я предпочитаю более явный стиль, я использовал в блог.