Подтвердить что ты не робот

Каковы относительные достоинства wxHaskell и Gtk2HS?

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

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

4b9b3361

Ответ 1

[Отказ от ответственности: я сторонник wxHaskell]

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

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

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

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

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

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

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

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

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

Ответ 2

В настоящее время немного легче заставить 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

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

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

Ответ 4

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

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)

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

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

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

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