Statet و WX واجهة المستخدم الرسومية التعايش
-
19-09-2019 - |
سؤال
يبدو أن برنامج Wxhaskell المعتاد
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 Monad المعتاد، أقصد Ihave للاستخدام liftIO
في كل مرة أعمل فيها إجراء IO.
هل هناك أي إمكانية عقدية لاستخدام ولاية موناد في Wxhaskell؟ انها ليست convinient جدا لتمرير الدولة إلى كل معالج الأحداث يدويا.
المحلول
برامج Wxhaskell التي قرأتها وكتبت فقط دفع الدولة إلى متغيرات.
http://wxhaskell.sourceforge.net/doc/graphics-ui-wx-variable.html.
إليك نظرة عامة جيدة: http://legacy.cs.uu.nl/daan/download/papers/wxhaskell.pdf.
ويستخدمون البداية بدلا من تشغيل.
نصائح أخرى
من الممكن النظرية، لكنني وجدت أنها مرهقة في الممارسة، كما فعلت. يبدو رمز WXHaskell الخاص بي عادة ما وصفته في مقال بلوق المشار إليه:
http://wewantarock.wordpress.com/01/01/11/custom-controls-in-wxhaskell-part-3/
يمكنك استخدام متغيرات Wxhaskell، كما اقترح JA، لنفس الغرض، على الرغم من أنني أفضل النمط الأكثر صراحة التي استخدمتها في المدونة.