Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

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

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

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

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

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

Я надеюсь, что это поможет вам с вашим выбором.

Другие советы

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

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

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

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

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>

Хотя все это очень расплывчато.Просто взгляните на некоторые реальные реактивные интерфейсы

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top