StateT и WX графическое сосуществование - PullRequest
1 голос
/ 11 марта 2010

обычная программа wxHaskell выглядит как

main = do 
        run gui

gui = do 
    .... 
    ....

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

Я пытаюсь сделать следующее:

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

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

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

Ответы [ 2 ]

0 голосов
/ 24 мая 2010

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

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

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

0 голосов
/ 11 марта 2010

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

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

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

...