Сосуществование графического интерфейса StateT и WX

обычная программа 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 каждый раз, когда я выполняю действие ввода-вывода.

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


person Vasiliy Stavenko    schedule 11.03.2010    source источник


Ответы (2)


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

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

И они используют start, а не run.

person ja.    schedule 11.03.2010
comment
в WX и WXCore есть два немного разных интерфейса. В WXCore используется run, а в WX используется start. У них один тип. - person Vasiliy Stavenko; 12.03.2010

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

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

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

person Jeremy O'Donoghue    schedule 24.05.2010