Каковы относительные достоинства wxHaskell и Gtk2HS? - PullRequest
20 голосов
/ 16 февраля 2009

Что лучше для разработки приложений с графическим интерфейсом на Haskell, wxWidgets (через wxHaskell ) или GTK (через Gtk2HS )?

Каковы плюсы и минусы каждого? Это зависит от того, на какую платформу вы нацеливаетесь (я бы прежде всего работал на OS X, но хотел бы, чтобы мои программы работали также на Linux и Windows)?

Ответы [ 4 ]

23 голосов
/ 02 марта 2009

[Отказ от ответственности: я сопровождающий wxHaskell]

Оба являются стабильными и достаточно полными привязками графического интерфейса, и вы можете выбрать любой из них для большинства проектов с уверенностью. Оба имеют некоторую степень «высокоуровневых» привязок Haskell, но в обоих случаях вам нужно будет перейти к довольно императивному кодированию в стиле C, чтобы добиться цели. У меня сложилось впечатление, что wxHaskell позволяет вам потратить немного больше времени на привязки более высокого уровня, но я не слишком много работал с GTK2HS, и в любом случае вы определенно обнаружите, что работаете над тонким концом оболочки для обеих библиотек - и я думаю, что общая «сложность» программирования одинакова в обоих случаях.

Поэтому давайте возьмем базовую функциональность как данность и сконцентрируемся на различиях. Обратите внимание, что я искренне верю, что GTK2HS - это отличная работа, и что вы будете счастливы, если выберете ее. Большая часть того, что я скажу ниже, - это личная оценка различий и того, почему я сам решил работать с wxHaskell.

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

wxHaskell обеспечивает истинный внешний вид приложения на всех поддерживаемых платформах из коробки. GTK2HS, конечно, является родным для Linux и имеет довольно хорошую нативную тему для Windows (то есть достаточно хорошую, чтобы удовлетворить все, кроме педантов ...), но имеет внешний вид GTK на OSX и зависит от установленного X11. Я считаю, что «родная» библиотека GTK для OSX находится в стадии разработки, но считается относительно незрелой. Как только это станет стабильным, GTK2HS сможет легко извлечь выгоду из того же «частично нативного» внешнего вида (например, GTK OSX screenshot ).

wxHaskell, вероятно, будет немного легче построить, если вы не используете Linux (GTK2HS, вероятно, проще, если вы работаете в Linux), но, если честно, и то, и другое довольно сложно построить, поскольку в нем существует значительное количество зависимостей оба случая.

Немного проще (IMHO) распространять приложения, основанные на wxHaskell, просто потому, что у него меньше библиотечных зависимостей. Я распространяю приложения, используя в основном InnoSetup для Windows и в качестве пакетов приложений для OSX. Я признаю, что при небольшом объеме дополнительной работы то же самое можно сделать с GTK2HS, так что это, вероятно, самый слабый аргумент в пользу wxHaskell.

По моему личному мнению, wxHaskell более дружественен к разработкам с закрытым исходным кодом (например, коммерческим). Это, конечно, тема бесконечных пламенных войн, поэтому я скажу только, что wxHaskell находится под лицензией wxWidgets , которая однозначно допускает разработку с закрытым исходным кодом. GTK2HS - это LGPL, поэтому вам нужно спросить своего адвоката - хотя я должен дать понять, что многие люди и компании пришли к выводу, что LGPL совместим с коммерческой разработкой; юристы компании, в которой я работаю, пришли к выводу, что она не подходит для наших проектов.

Я думаю, что если бы Linux был моей основной платформой для разработки и доставки, я бы, вероятно, использовал GTK2HS. Однако это не так: я поставляю в основном Windows с OSX, и мне кажется, что wxHaskell лучше подходит для этих платформ, хотя оба варианта поддерживают все три платформы.

Надеюсь, это поможет вам с выбором.

4 голосов
/ 02 марта 2009

Следует учитывать, что в настоящее время немного проще заставить wxHaskell работать на Mac OS X в исходном режиме. GTK2HS зависит от GTK, который имеет реализацию, использующую собственные виджеты в Mac OS X, но эта реализация не так легко построить Реализация wxWidgets для Mac OS X:

Поэтому, если вы хотите разработать код для запуска без X11.app, в настоящее время вам немного лучше с wxHaskell.

Обратите внимание, что это быстро меняется: http://www.haskell.org/haskellwiki/Gtk2Hs#Using_the_GTK.2B_OS_X_Framework показывает, как использовать GTK2HS с собственным GTK + в Mac OS X.

Одним из преимуществ GTK2HS является поддержка GLADE, что делает разработку простого пользовательского интерфейса очень быстрой. Комбинаторы более высокого уровня в wxHaskell уменьшают большую часть этого преимущества, но они требуют более глубокого понимания того, как вы хотите, чтобы ваш интерфейс выглядел и вел себя, и поэтому их сложнее использовать в исследовательском режиме.

3 голосов
/ 20 февраля 2009

У меня довольно неполная информация, но поскольку у вас еще нет ответов, возможно, неполная информация лучше, чем ничего.

Вопрос, который необходимо задать, заключается в следующем: является ли инструментарий просто оболочкой для C-подобной функциональности, или есть дополнительный слой, который дает инструментарию более «родной» Haskell-подобный API? Когда wxHaskell был впервые анонсирован на семинаре по Haskell, разработка нативного API Haskell выглядела чрезвычайно многообещающе, но все еще не была завершена. Похоже, что «Haskellized» API для wxHaskell все еще работает, в то время как проект Gtk2Hs вообще не затрагивает эту проблему. По этой причине я бы порекомендовал wxHaskell.

0 голосов
/ 03 февраля 2012

Лично я бы посмотрел на какой-нибудь реактивный пакет / расширение. Кажется, что сидеть с парадигмой гораздо ближе. Вместо того, чтобы указывать свои графические элементы обязательно, вы можете сделать это декларативно. Пример (не является представителем какого-либо конкретного языка или реализации):

x, y, z              :: Int
click, buttonclicked :: Bool
x = <X coordinate of mouse>
y = <Y coordinate of mouse>
click = <Whether mouse button is currently being pressed>
z = x + y
buttonclicked = (x == 10 && y == 10 && click)

Нажатие кнопки и z будут автоматически обновляться при каждом изменении x и y.

Тогда у вас может быть где-то логика, которая выглядит примерно так:

if buttonclicked then <do something> else <do something else>

Это все очень нечетко, хотя. Просто посмотрите на некоторые реальные реактивные интерфейсы

...