У нас есть большое консольное приложение в Haskell, которое мне поручено сделать кросс-платформу и добавить gui.
Требования:
- Родной, как возможно, внешний вид.
- Клиенты для Windows и Mac OS X, если возможно, Linux.
- Для установки не требуется отдельное время выполнения.
- Отсутствует необходимая сетевая связь. Код haskell имеет очень чувствительную информацию, которая не может передаваться по проводу. Это действительно единственная причина, по которой это не веб-приложение.
Теперь, настоящая причина этого вопроса - объяснить одно решение, которое я сейчас исследую, и запросить по причинам, о которых я не думаю, что это плохая идея.
Мое решение - родной gui. Winforms в Windows, Cocoa в Mac OS X и GTK/Glade на Linux, который просто обрабатывает презентацию. Затем я бы написал слой поверх кода Haskell, который превращает его в ответчика для сообщений в пользовательский интерфейс и из него с помощью ZeroMQ для обработки сообщений и, возможно, протобуфов для сериализации данных взад и вперед. Таким образом, начнется собственное приложение, которое само запустило бы демона, где происходит вся магия, и отправляйте сообщения туда и обратно.
Помимо того, что демон только принимает соединения из приложения, которое его запускало, и проблема предоставления правильных данных назад и вперед для расширенных элементов gui (я думаю, что таблицы, ячейки и т.д.), я не вижу много недостатков.
Что я не задумываюсь о том, что это плохая идея?
Я, наверное, должен упомянуть, что на первый взгляд я собирался пойти с GTK на всех платформах. Проблема в том, что, пока она закрывается, и поддержка GTK и Glade для Haskell приятно работать, результат не выглядит "правильным". Он близок, но не слишком утончен в тонких способах, которые делают это решение неприемлемым для людей, которые, случается, пишут чек для этой работы.
Кроме того, проблема с несколькими платформами и, следовательно, с несколькими языками для gui не является проблемой, поэтому я не обязательно ищу другие способы решения этой проблемы, если это не упростит что-то о взаимодействии с кодом haskell.