Рамки веб-сервисов в haskell

Прежде всего, я довольно новичок в Haskell, но должен сказать, что я влюбился в этот язык, так как начал играть с ним. Я сделал обширные C, Java, python и perl. Хаскелл определенно растет на меня. Я написал веб-приложение/услуги в perl/python для одного из моих личных проектов некоторое время назад - мне было интересно, могу ли я переместить его в haskell в качестве забавного проекта и сделать хакели хакель, чтобы увидеть, как он развивается.

Я знаю, что есть некоторые выдающиеся рамки для веб-приложений в haskell. То, что я хотел бы сделать, это иметь сервис, написанный в haskell, который будет отвечать данными в разных форматах (SOAP, REST-xml, REST-json). Я бы использовал javascript для сборки DOM и т.д. Итак, мой вопрос: существуют ли библиотеки, которые я мог бы использовать для преобразования формата данных "на лету"? Или с учетом сценария, как бы вы это сделали в haskell?

Я не играл с этим проектом с 2008 года, и моя первоначальная мысль заключалась в том, чтобы использовать apacheCXF из сообщества java и кодировать все это в java. Но я бы хотел сделать это в Хаскелле. Любые подсказки?

Ответ 1

Я написал что-то подобное, используя Happstack.

То, что я сделал, это создать тип для представления всех возможных ответов моего веб-приложения.

data AppResponse = Foo String Int | Bar [String] | etc

затем написал мои обработчики для возврата значений этого типа:

home :: ServerPart AppResponse
user :: UserId -> ServerPart AppResponse

и т.д.,

Затем я написал функции, которые отображали бы ответ в разных форматах:

jsonResponse :: AppResponse -> JSON
xmlResponse  :: AppResponse -> XML

и др.

Затем есть простой фильтр, который смотрит на заголовок Accept и решает, какую из этих функций преобразования использовать.

Этот подход хорош, потому что:

  • большая часть кода не должна знать ничего о формате ответа (xml, json и т.д.).
  • Чтобы добавить новый формат, вы просто пишете новую функцию, например, newFormatResponse :: AppResponse -> NewFormat. Тип AppResponse описывает каждый возможный ответ, поэтому вам не нужно искать весь код, выясняя, какие ответы возможны даже.

Ответ 2

Существует страница haskellwiki, посвященная этой теме. Среди этих HappStack и Yesod самый зрелый. Для новичков я бы рекомендовал HappStack, так как Yesod использует довольно много магии QuasiQuotes.

HappStack имеет только магию в этом модуле состояния. Из того, что я слышал, это будет изменено в HappStack 7, где будет изменено использование MACID-хранилища, которое намного менее волшебное и имеет меньшее количество шаблонов.

Если вам нужно что-то равное, вы должны взглянуть на Snap framework.