Sto provando a creare un server Web stupido che memorizza i dati come State
. Sto usando Web.Scotty
. I've used ReaderT before with scotty to access config, ma seguire lo stesso approccio non funziona qui. Reimposta lo stato su ogni richiesta.Usa StateT all'interno di Web.Scotty
Desidero impostare lo stato iniziale all'avvio del programma, quindi mantenere lo stesso stato per tutta la durata del programma.
Come posso fare questo lavoro? (Di seguito crea un nuovo stato ogni richiesta)
{-# LANGUAGE OverloadedStrings #-}
import Web.Scotty.Trans
import Control.Monad.State (StateT, evalStateT, lift)
import qualified Control.Monad.State as S
import Data.Text.Lazy (Text)
main :: IO()
main = do
let runner = flip evalStateT "message"
scottyT 3000 runner runner routes
routes :: ScottyT Text (StateT Text IO)()
routes = do
get "/data" $ do
val <- lift S.get
text val
put "/data/:val" $ do
val <- param "val"
lift $ S.put val
text val
Anche nei server Web scritti in lingue completamente non funzionanti (apache, tomcat, ecc.), In genere non si memorizza lo stato condiviso nella memoria .... È necessario preoccuparsi del blocco, dello stato di archiviazione all'arresto, mappare i dati agli utenti, ecc. Questo è il motivo per cui esistono database ... Suppongo che non si possa fare ciò che si vuole fare in Scotty, e gli autori di Scotty non vorrebbero implementarlo (ma questo è solo la mia ipotesi). – jamshidh
Questo ha senso. L'unica ragione per cui sto facendo questo è insegnare ad alcune persone che haskell proviene da node.js e mi è sembrato un primo passo facile prima di inserire un database. Indovinate comunque :) –