Разработка чисто функционального обработчика веб-приложений в Scala - PullRequest
0 голосов
/ 20 апреля 2011

В веб-приложении обработчик обычно состоит из функции, принимающей запрос и возвращающей ответ:

val handler:Request=>Response

Какой будет «самый чистый» функциональный подход, если обработчик займет некотороепараметры из запросов, изменяет некоторое общее изменяемое состояние (например, базу данных), а затем возвращает ответ?

Ответы [ 2 ]

3 голосов
/ 20 апреля 2011

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

val handler : Request => State => (Response, State)

Это похоже на монаду IO в Haskell. Это можно определить так в Scala:

type IO[A] = State => (A, State)

Таким образом, вышесказанное можно записать более кратко как:

val handler : Request => IO[Response]

2 голосов
/ 20 апреля 2011

Каким будет «самый чистый» функциональный подход, если обработчик берет некоторые параметры из Запроса, изменяет некоторое общее изменяемое состояние (например, базу данных), а затем возвращает Ответ?Как это будет сделано в Haskell?

Это будет обрабатываться монадически, например,

handler :: Request -> Web Response

тип указывает, что обработчик получит значение Request и выполнит некоторые действияв вычислительной среде Web (содержащей такие вещи, как общая база данных) перед возвратом Response.

Если вы щуритесь, вы действительно можете увидеть такую ​​модель на производственном веб-сервере Haskell, оснастка .Все эффекты происходят в монаде Snap.


Редактировать: Я вижу, вы изменили свой вопрос, чтобы не включать ответ на Haskell.Тем не менее, есть много работы по созданию хороших веб-систем в Haskell.Глядя на Snap или Yesod - это место для начала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...