2011-01-04 2 views
10

Я посмотрел на веб-рамки Haskell, такие как Snap и Yesod. Большинство, похоже, реализуют подход MVC-ish, напоминающий мне о веб-фреймворках, таких как Ruby on Rails. Да, MVC может быть достигнуто с помощью FP, но IMHO не показывает больших преимуществ подхода FP. Поскольку HTTP - это протокол без учета состояния, я бы надеялся, что может существовать инфраструктура Haskell, которая использует более оригинальный, более чистый функциональный подход. Есть ли какие-нибудь?Есть ли более оригинальные, более функциональные веб-фреймворки Haskell?

+9

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

+1

Ну, веб-приложения имитируют состояние между запросами с такими вещами, как состояние сеанса, но есть небольшое внутреннее основание для состояния. Просто разработчики так привыкли искать решение таким образом (например, используя сеансы на стороне сервера). –

+1

@WardB: сеансы на стороне сервера предлагают экономию пропускной способности/пропускной способности, которой было бы сложнее достичь, если бы каждая отдельная часть данных была выгружена до клиент и должен был быть отправлен обратно по каждому запросу. Конечно, при появлении HTML5 хранение данных сеанса на стороне клиента может стать проще благодаря встроенному sqlite db; Разумеется, он не решает вопрос безопасности. Еще интересный вопрос :) –

ответ

9

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

  • Типобезопасного URL-адреса устранить целый класс опечатки сгенерированных ошибок, а также автоматически иметь дело с проверкой ввода.

  • Правильный набор текста практически исключает атаки XSS.

  • В зависимости от объема данных, с которыми вы имеете дело, используя STM или MVars для хранения данных, вы можете легко избежать условий гонки и взаимоблокировок в многопоточных приложениях.

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

+0

Спасибо за ваш ответ. Мое понимание продолжения состоит в том, что на самом деле это очень касается состояния. Использование модели в веб-разработке старается достичь моделируемой состояния. –

+0

Лучший ответ до сих пор. –

2

Это зависит от того, чего вы пытаетесь достичь. Если с помощью stateless вы фактически имеете в виду без гражданства, я использую шаблон templating Hakyll для генерации статических страниц. Он имеет интересную структуру для работы с зависимостями и обновлениями файлов.

+0

Я не имел в виду статические страницы. Просто нет общего состояния между запросами/ответами или побочными эффектами –

+0

Если нет общего состояния и никаких побочных эффектов ... Что вы можете сделать, что статические страницы не могут? – Carl

+0

@Carl: содержимое страницы может генерироваться динамически (в зависимости от параметров запроса). –

1

Я искал то же самое, но еще не нашел его. В частности, я искал подход продолжения, который делает традиционные HTTP-сеансы ненужными. Эти виды фреймворков довольно популярны на Схеме. Наиболее близким, что я нашел ответ Криса Eidhof на Триумфальную вызов: -

https://gist.github.com/260052

Это схематичны прототип и, вероятно, много человеко-месяцев далеко от того, что-то, что вы могли бы использовать для серьезной работы. Если бы мои навыки Хаскелла были лучше, у меня могло возникнуть соблазн попытаться его развить.

Я также считаю, что WASH также придерживался такого подхода, но, похоже, умер. Я привязываю свои надежды на mysnapsession, поскольку, как я полагаю, он также смотрит на сеанс, основанный на продолжениях, который был бы увлекательным, потому что я был очень впечатлен качеством остальной части Snap и ее динамикой.

2

Я думаю, что WardB задавал вопрос не о причудливых типах, а скорее о семантике денотативных/безгражданства FP, в отличие от императивной/неценотентной (и часто недетерминированной) семантики таких вещей, как IO и STM. Именно этот денотативный аспект поддерживает точные & разумные рассуждения. Термин «функциональный» был растянут, чтобы охватить также императивное/неценотентное программирование, что часто приводит к путанице. Peter Landin recommended заменить «функциональный» на «денотативный», чтобы прояснить именно такую ​​путаницу.

Я не знаю каких-либо денотативных (неимперативных) веб-фреймворков Haskell. Получение там, вероятно, потребует устранения некоторых давних императивных умственных привычек. То есть: интересная работа!