2013-01-25 3 views
7

Я пытаюсь получить более подробную информацию о Haskell, разработав веб-приложения.Haskell Webserver: сохранение состояния приложения

Скажем, я разрабатываю веб-сервер, и я хочу поддерживать постоянное состояние между запросами; счетчик, например. Что такое способ Хаскелла?

Я столкнулся с этим discussion в своем поиске в Google. Предлагаемое решение выглядит хорошим примером того, что не нужно делать.

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

requestHandler :: MVar State -> IO (Maybe Response) 

При регистрации обработчика, это может быть кэрри с MVar создан в основном.

Должен быть лучший способ. Я не могу не думать, что я приближаюсь к этой проблеме нефункциональным способом.

Спасибо!

+0

Почему пытаются нести постоянное состояние на самом сервере? Кажется, что Haskell будет лучше сочетаться с дизайном RESTful. –

+1

Что такое «нефункциональный» об этом подходе? У вас есть какое-то состояние, которое вам нужно разделить, поэтому вы завершаете его и передаете ссылку. Для меня это довольно просто. – sclv

+0

sclv: Мне интересно, был ли еще подход FRP. – David

ответ

4

Возможно, вы захотите acid-state, что дает вам именно то, что: постоянное состояние для типов данных Haskell. Документация, которую я связал, даже начинается с счетчика запросов, как и вы просили.

Обратите внимание, что MVars не являются стойкими; счетчик будет сброшен при перезапуске сервера. Если это на самом деле поведение, которое вы хотите, я предлагаю вам вместо этого использовать TVar; таким образом вы можете обновлять счетчик атомарно без блокировок или риск взаимоблокировок, которые идут с ними.

1

Если вам нравятся настойчивость и ТВАР, вы можете использовать DBRefs, которые имеют одинаковую семантику и одинаковые шаблоны использования, такие как TVars. Вы должны определить уникальный ключ для состояния, и у вас есть автоматическое сохранение файлов. Для сохранения базы данных необходимо определить экземпляр IResource.

Государство будет иметь уникальный счетчик для каждой сессии:

import Data.Map as M 
import Data.TCache 
import Data.TCache.DefaultPersistence 

type Counter= Int 
type SessionId :: String 
data State= State SessionId Counter deriving (Read, Show, Typeable) 

instance Indexable State where 
     key (State k _)= k 

requestHandler :: Request -> DBRef State -> IO (Maybe Response) 
Смежные вопросы