Ответ 1
Я написал приложения в Haskell, используя оба метода (клиент/сервер, native), и оба они приходят с их преимуществами. Я понимаю, что это больше, о чем вы просили, но я документировал проблемы и недостатки обоих подходов в надежде, что это поможет вам принять более обоснованное решение.
Более конкретно подходы, которые я использовал, были:
- Веб-приложения, которые используют Haskell в качестве бэкэнд и Javascript/HTML для интерфейса. Связь была выполнена исключительно с использованием JSON. На бэкэнд не было создано HTML или Javascript.
- Натурально в чистом Haskell с использованием GTK2HS
К первому подходу относятся:
- Мне пришлось отделить GUI-код от логики конца. Это определенно сделано для более чистого дизайна.
- Haskell теперь имеет высокопроизводительные веб-серверы [4,5]. Он также имеет отличную поддержку CGI/FastCGI и базы данных, если вы хотите писать скрипты в стиле PHP на сторонних веб-серверах. Я использовал последний подход, и он работал очень хорошо.
- Библиотеки пользовательского интерфейса теперь достаточно хороши, когда создание интерфейса в Javascript довольно приятное. Я очень доволен Qooxdoo [2], но есть несколько вариантов (jQuery, ExtJS...)
- Программная транзакционная память [3] делает тривиальным сохранение одновременно доступного состояния на стороне сервера. STM - единственная причина, по которой этот подход является жизнеспособным и забавным.
- Мне понравилось, что пользовательский интерфейс был совместим и легко развертывается на любых платформах, которые могут запускать веб-браузер. Если ваше приложение должно работать на Mac, а также в Windows и Linux, я все равно считаю, что это лучший способ пойти (подробнее см. Ниже).
Нижними признаками первого подхода являются:
- Мне приходилось разбираться с проверкой подлинности и сеансами, даже когда я знал, что это однопользовательское приложение. В настоящее время существуют рамки (Yesod, Happstack...), которые помогают в этом, но я думаю, что это случайная сложность, которую можно избежать, написав собственное приложение.
- Мне пришлось свернуть собственный клиентский протокол связи с сервером. Расширение протокола и обеспечение его правильности были болезненными на конце Javascript, но были абсолютной радостью на конце Haskell. Я подозреваю, что это будет применимо к любой комбинации GUI-friendly-language/Haskell, которую вы выберете.
- Хороший кусок моего кода закончил просто сортировку и разбор данных JSON. Это сейчас проблема, потому что я думаю, что есть несколько Haskell libs для этой заявки для автоматизации этого [1].
- Большинство хостов не поддерживают приложения Haskell.
Верхние стороны второго подхода:
- вся ваша разработка находится на одном языке и поэтому ее легче протестировать.
- Glade отлично подходит для визуального создания GUI, и интеграция Haskell очень хороша.
- Простое развертывание в Windows и Linux.
- GTK2HS очень хороший, полный и хорошо документированный.
- Связи также пытаются зеркально отразить структуру OO самого GTK. Для этого есть недостатки (см. Ниже), но большим преимуществом является то, что я смог использовать документацию для других языковых привязок, чтобы заполнить любые пробелы в документации. Когда я развился, я постоянно обращался к превосходным документам GTK от Python.
Нижними признаками второго подхода являются:
- развертывание приложения GTK2HS на Mac ужасно божественно и выглядит уродливо для загрузки.
- Установка GTK2HS на Windows является нетривиальной, на Mac это открытая исследовательская проблема.
- GTK2HS требует, чтобы вы писали очень унииоматичный Haskell. Там изменчивое состояние повсюду и отсутствие объектов означает, что вы в основном пишете процедурный код.
Надеюсь, это не было TMI.
-deech
[1] http://www.google.co.uk/search?hl=en&as_sitesearch=hackage.haskell.org%2Fpackage&as_q=json
[3] http://www.haskell.org/haskellwiki/Software_transactional_memory