Я хочу написать веб-сервер, который хранит свое состояние в монаде State
с _2 _ / _ 3_. Что-то вроде этого:
{-# LANGUAGE OverloadedStrings #-}
import Network.Wai
import Network.Wai.Handler.Warp
import Network.HTTP.Types
import Control.Monad.State
import Data.ByteString.Lazy.Char8
main = run 3000 app
text x = responseLBS
status200
[("Content-Type", "text/plain")]
x
app req = return $ text "Hello World"
app1 req = modify (+1) >>= return . text . pack . show
-- main1 = runStateT (run 3000 app1) 0
Строка с комментариями, конечно, не работает. Цель состоит в том, чтобы сохранить счетчик в монаде состояний и отображать его возрастающее значение при каждом запросе.
Кроме того, как получить потокобезопасность? Warp запускает мое промежуточное ПО последовательно или параллельно?
Какие параметры доступны для состояния - могу ли я использовать что-нибудь, кроме IORef
, в этом сценарии?
Я понимаю, что государство дает безопасность, но похоже, что вай не позволяет государству.
Мне нужен исключительно простой однопоточный RPC, который я могу вызвать откуда-то еще. Пакет Haxr
требует отдельного веб-сервера, что является излишним. См. Вызов Haskell из Node.JS - никаких предложений не было, поэтому я написал простой сервер с использованием Wai / Warp и Эсон. Но похоже, что WAI был разработан для поддержки параллельных реализаций, поэтому это усложняет ситуацию.