在内存中保存状态 [Haskell 服务器]

Save state in memory [Haskell Server]

我正在尝试创建一个服务器,该服务器 returns 来自路由的两个不同值取决于用户之前是否访问过它。我有以下代码:

{-# LANGUAGE OverloadedStrings #-}
module Main where

import Web.Scotty

main = do
    putStrLn "Starting Server..."
    scotty 3000 $ do
        get "/" $ do
            -- if first time 
            text "hello!"
            -- if second time
            text "hello, again!"

我有两个问题: 1. 如何查看用户之前是否请求过路由? 2. 我在哪里以及如何保存应用程序状态?

您可以使用 STM 在内存中保存一个可变变量:

import Control.Concurrent.STM.TVar

main = do
    putStrLn "Starting Server..."
    state <- newTVarIO :: IO VisitorsData
    scotty 3000 $ do
        get "/" $ do
            visitorsData <- readTVarIO state
            -- if the visitor's ID/cookie is in visitorsData
            text "hello!"
            -- if new visitor, add them to visitorsData
            atomically $ modifyTVar state $ insertVisitor visitorId visitorsData
            -- if second time
            text "hello, again!"

(如果您希望将其扩展到复杂的服务器,您需要以 ReaderT pattern 的形式传递 TVar)